static void xposedInitMemberOffsets() { PTR_gDvmJit = dlsym(RTLD_DEFAULT, "gDvmJit"); if (PTR_gDvmJit == NULL) { offsetMode = MEMBER_OFFSET_MODE_NO_JIT; } else { offsetMode = MEMBER_OFFSET_MODE_WITH_JIT; } ALOGD("Using structure member offsets for mode %s", xposedOffsetModesDesc[offsetMode]); MEMBER_OFFSET_COPY(Thread, jniLocalRefTable); MEMBER_OFFSET_COPY(Thread, status); MEMBER_OFFSET_COPY(Thread, jniEnv); MEMBER_OFFSET_COPY(DvmJitGlobals, codeCacheFull); }
static bool xposedInitMemberOffsets(JNIEnv* env) { PTR_gDvmJit = dlsym(RTLD_DEFAULT, "gDvmJit"); if (PTR_gDvmJit == NULL) { offsetMode = MEMBER_OFFSET_MODE_NO_JIT; } else { offsetMode = MEMBER_OFFSET_MODE_WITH_JIT; } ALOGD("Using structure member offsets for mode %s", xposedOffsetModesDesc[offsetMode]); MEMBER_OFFSET_COPY(DvmJitGlobals, codeCacheFull); int overrideCodeCacheFull = xposedReadIntConfig(XPOSED_OVERRIDE_JIT_RESET_OFFSET, -1); if (overrideCodeCacheFull > 0 && overrideCodeCacheFull < 0x400) { ALOGI("Offset for DvmJitGlobals.codeCacheFull is overridden, new value is 0x%x", overrideCodeCacheFull); MEMBER_OFFSET_VAR(DvmJitGlobals, codeCacheFull) = overrideCodeCacheFull; } // detect offset of ArrayObject->contents jintArray dummyArray = env->NewIntArray(1); if (dummyArray == NULL) { ALOGE("Could allocate int array for testing"); dvmLogExceptionStackTrace(); env->ExceptionClear(); return false; } jint* dummyArrayElements = env->GetIntArrayElements(dummyArray, NULL); arrayContentsOffset = (size_t)dummyArrayElements - (size_t)dvmDecodeIndirectRef(dvmThreadSelf(), dummyArray); env->ReleaseIntArrayElements(dummyArray,dummyArrayElements, 0); env->DeleteLocalRef(dummyArray); if (arrayContentsOffset < 12 || arrayContentsOffset > 128) { ALOGE("Detected strange offset %d of ArrayObject->contents", arrayContentsOffset); return false; } return true; }