首页 > 解决方案 > 在 JNI 案例中调用 openDexFile 函数后,Env 停止正常工作

问题描述

我有在 android 应用程序中加密 classes.dex 文件以进行反向保护的应用程序。解密 classes.dex 后从内存动态加载,但我遇到了 android 4.4 KitKat (api level 19) 的问题。在模拟器(Android Studio 的 AVD)上启动加密的 apk 后,它崩溃了。

问题出在这段代码中:

jint mCookie = mem_loadDex_dvm(env, (char *)szDexPath);
// error appears in line below
jclass DexFileClass = env->FindClass("dalvik/system/DexFile");

github中的一行

究竟是否要跳转到 mem_loadDex_dvm 函数,此行后出现问题

openDexFile(args, &pResult);

github中的一行

错误文字:

W/dalvikvm: JNI WARNING: JNI function FindClass called with exception pending
W/dalvikvm:              in Lcom/storm/fengyue/Native;.attachBaseContext:(Landroid/content/Context;)V (FindClass)
W/dalvikvm: Pending exception is:
I/dalvikvm: java.lang.RuntimeException: unable to open in-memory DEX file
I/dalvikvm:     at com.storm.fengyue.Native.attachBaseContext(Native Method)
I/dalvikvm:     at com.storm.fengyue.StubApplication.attachBaseContext(StubApplication.java:105)
I/dalvikvm:     at android.app.Application.attach(Application.java:181)
I/dalvikvm:     at android.app.Instrumentation.newApplication(Instrumentation.java:991)
I/dalvikvm:     at android.app.Instrumentation.newApplication(Instrumentation.java:975)
I/dalvikvm:     at android.app.LoadedApk.makeApplication(LoadedApk.java:511)
I/dalvikvm:     at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4317)
I/dalvikvm:     at android.app.ActivityThread.access$1500(ActivityThread.java:135)
I/dalvikvm:     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1256)
I/dalvikvm:     at android.os.Handler.dispatchMessage(Handler.java:102)
I/dalvikvm:     at android.os.Looper.loop(Looper.java:136)
I/dalvikvm:     at android.app.ActivityThread.main(ActivityThread.java:5017)
I/dalvikvm:     at java.lang.reflect.Method.invokeNative(Native Method)
I/dalvikvm:     at java.lang.reflect.Method.invoke(Method.java:515)
I/dalvikvm:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
I/dalvikvm:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
I/dalvikvm:     at dalvik.system.NativeStart.main(Native Method)
I/dalvikvm: "main" prio=5 tid=1 NATIVE
I/dalvikvm:   | group="main" sCount=0 dsCount=0 obj=0x9cd62bd8 self=0xb8d0e4a0
I/dalvikvm:   | sysTid=2388 nice=0 sched=0/0 cgrp=[fopen-error:2] handle=-1216544672
I/dalvikvm:   | state=R schedstat=( 0 0 0 ) utm=16 stm=0 core=3
I/dalvikvm:   #00  pc 000bd4b6  /system/lib/libdvm.so (dvmDumpNativeStack(DebugOutputTarget const*, int)+86)
I/dalvikvm:   #01  pc 00098093  /system/lib/libdvm.so (dvmDumpThreadEx(DebugOutputTarget const*, Thread*, bool)+1155)
I/dalvikvm:   #02  pc 00098386  /system/lib/libdvm.so (dvmDumpThread(Thread*, bool)+86)
I/dalvikvm:   #03  pc 0004ce17  /system/lib/libdvm.so (ScopedCheck::checkThread(int)+455)
I/dalvikvm:   #04  pc 000601e5  /system/lib/libdvm.so
I/dalvikvm:   #05  pc 00008a26  /data/data/home.blank/files/.jiagu/libdexload.so (mem_loadDex(_JNIEnv*, _jobject*, char const*)+1334)
I/dalvikvm:   #06  pc 00009158  /data/data/home.blank/files/.jiagu/libdexload.so (native_attachBaseContext(_JNIEnv*, _jobject*, _jobject*)+1096)
I/dalvikvm:   #07  pc 0002a0eb  /system/lib/libdvm.so (dvmPlatformInvoke+79)
I/dalvikvm:     at com.storm.fengyue.Native.attachBaseContext(Native Method)
I/dalvikvm:     at com.storm.fengyue.StubApplication.attachBaseContext(StubApplication.java:105)
I/dalvikvm:     at android.app.Application.attach(Application.java:181)
I/dalvikvm:     at android.app.Instrumentation.newApplication(Instrumentation.java:991)
I/dalvikvm:     at android.app.Instrumentation.newApplication(Instrumentation.java:975)
I/dalvikvm:     at android.app.LoadedApk.makeApplication(LoadedApk.java:511)
I/dalvikvm:     at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4317)
I/dalvikvm:     at android.app.ActivityThread.access$1500(ActivityThread.java:135)
I/dalvikvm:     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1256)
I/dalvikvm:     at android.os.Handler.dispatchMessage(Handler.java:102)
I/dalvikvm:     at android.os.Looper.loop(Looper.java:136)
I/dalvikvm:     at android.app.ActivityThread.main(ActivityThread.java:5017)
I/dalvikvm:     at java.lang.reflect.Method.invokeNative(Native Method)
I/dalvikvm:     at java.lang.reflect.Method.invoke(Method.java:515)
I/dalvikvm:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
I/dalvikvm:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
I/dalvikvm:     at dalvik.system.NativeStart.main(Native Method)
E/dalvikvm: VM aborting

它不依赖于 FindClass,其他函数给出相同的错误(env->GetFieldID 或 env->SetFieldID)。试图显示 env 十六进制值,它在问题行之前和之后类似​​。检查是否附加了当前线程的 JNI。

所有代码都在github

标签: javaandroidc++java-native-interface

解决方案


推荐阅读