diff --git a/edxp-core/src/main/cpp/external/yahfa/src/trampoline.c b/edxp-core/src/main/cpp/external/yahfa/src/trampoline.c index 31bebf52..1892d672 100644 --- a/edxp-core/src/main/cpp/external/yahfa/src/trampoline.c +++ b/edxp-core/src/main/cpp/external/yahfa/src/trampoline.c @@ -131,10 +131,24 @@ void *genTrampoline(void *toMethod, void *entrypoint) { size_t size = entrypoint == NULL ? sizeof(trampoline) : sizeof(trampolineForBackup); // TODO: make use of thread_local to avoid frequent memory allocate - char *targetAddr = doInitHookCap(size + 4); + size_t oatHeaderLen; + switch (SDKVersion) { + case __ANDROID_API_O__: + case __ANDROID_API_O_MR1__: + case __ANDROID_API_P__: + oatHeaderLen = 12 + 12; // 3*u32 + QuickMethodFrameInfo(3*u32) + break; + default: + LOGW("No valid offset in SDK %d for oatHeaderLen, using Android R", SDKVersion); + case __ANDROID_API_Q__: + case __ANDROID_API_R__: + oatHeaderLen = 8; // 2*u32 + break; + } + char *targetAddr = doInitHookCap(size + oatHeaderLen); // 4 bytes for AOT header, then copy code_size_. - memcpy(targetAddr, toMethod - 4, 4); - targetAddr += 4; + memcpy(targetAddr, toMethod - oatHeaderLen, oatHeaderLen); + targetAddr += oatHeaderLen; if (targetAddr == NULL) return NULL;