| 117 | } |
| 118 | |
| 119 | void ArtM::InitArtMethod(JNIEnv *env, int api_level) { |
| 120 | registerArtNative(env); |
| 121 | ArtMethodEnv.api_level = api_level; |
| 122 | |
| 123 | jclass clazz = env->FindClass("top/niunaijun/jnihook/jni/ArtMethod"); |
| 124 | jmethodID nativeOffsetId = env->GetStaticMethodID(clazz, "nativeOffset", "()V"); |
| 125 | jmethodID nativeOffset2Id = env->GetStaticMethodID(clazz, "nativeOffset2", "()V"); |
| 126 | |
| 127 | void *nativeOffset = GetArtMethod(env, clazz, nativeOffsetId); |
| 128 | void *nativeOffset2 = GetArtMethod(env, clazz, nativeOffset2Id); |
| 129 | ArtMethodEnv.art_method_size = (size_t) nativeOffset2 - (size_t) nativeOffset; |
| 130 | |
| 131 | // calc native offset |
| 132 | auto artMethod = reinterpret_cast<uintptr_t *>(nativeOffset); |
| 133 | for (int i = 0; i < ArtMethodEnv.art_method_size; ++i) { |
| 134 | if (reinterpret_cast<void *>(artMethod[i]) == native_offset) { |
| 135 | ArtMethodEnv.art_method_native_offset = i; |
| 136 | break; |
| 137 | } |
| 138 | } |
| 139 | |
| 140 | uint32_t flags = 0x0; |
| 141 | flags = flags | kAccPublic; |
| 142 | flags = flags | kAccStatic; |
| 143 | flags = flags | kAccNative; |
| 144 | flags = flags | kAccFinal; |
| 145 | if (api_level >= __ANDROID_API_Q__) { |
| 146 | flags = flags | kAccPublicApi; |
| 147 | } |
| 148 | |
| 149 | char *start = reinterpret_cast<char *>(artMethod); |
| 150 | for (int i = 1; i < ArtMethodEnv.art_method_size; ++i) { |
| 151 | auto value = *(uint32_t * )(start + i * sizeof(uint32_t)); |
| 152 | if (value == flags) { |
| 153 | ArtMethodEnv.art_method_flags_offset = i * sizeof(uint32_t); |
| 154 | ArtMethodEnv.art_method_dex_code_item_offset = (i + 1) * sizeof(uint32_t); |
| 155 | break; |
| 156 | } |
| 157 | } |
| 158 | } |
nothing calls this directly
no test coverage detected