更改包名称android清单会导致问题JNI

我一直在修改和玩这个项目:

源代码: https : //bitbucket.org/viet0904163136/gba-android/src

这是一个在GPLv2下获得许可的gameboy Advance模拟器。 在我更改android清单文件中的packagename之前,每件事都可以正常工作。

如果没有更改包名称,应用程序可以正常运行。 但是当包名更改时,SDLactivity将退出并显示以下消息:(我将其重命名为com.gba.emu)

09-01 12:23:16.409: I/SDL(884): SDL_Android_Init() 09-01 12:23:16.409: W/dalvikvm(884): JNI WARNING: received null jclass 09-01 12:23:16.419: W/dalvikvm(884):in Lorg/libsdl/app/SDLActivity;.nativeInit:()V (GetStaticMethodID) 09-01 12:23:16.419: I/dalvikvm(884): "SDLThread" prio=5 tid=17 NATIVE 09-01 12:23:16.419: I/dalvikvm(884): | group="main" sCount=0 dsCount=0 obj=0x4183fc00 self=0x2a2b6f88 09-01 12:23:16.419: I/dalvikvm(884): | sysTid=1148 nice=0 sched=0/0 cgrp=apps handle=707490776 09-01 12:23:16.479: I/dalvikvm(884): | state=R schedstat=( 4273431 73605592 10 ) utm=0 stm=0 core=0 09-01 12:23:16.589: I/dalvikvm(884): #00 pc 000012fe /system/lib/libcorkscrew.so (unwind_backtrace_thread+29) 09-01 12:23:16.700: I/dalvikvm(884): #01 pc 0005fd92 /system/lib/libdvm.so (dvmDumpNativeStack(DebugOutputTarget const*, int)+33) 09-01 12:23:16.700: I/dalvikvm(884): #02 pc 00053e28 /system/lib/libdvm.so (dvmDumpThreadEx(DebugOutputTarget const*, Thread*, bool)+395) 09-01 12:23:16.700: I/dalvikvm(884): #03 pc 00053e96 /system/lib/libdvm.so (dvmDumpThread(Thread*, bool)+25) 09-01 12:23:16.700: I/dalvikvm(884): #04 pc 000385c0 /system/lib/libdvm.so 09-01 12:23:16.700: I/dalvikvm(884): #05 pc 00038896 /system/lib/libdvm.so 09-01 12:23:16.709: I/dalvikvm(884): #06 pc 0003985c /system/lib/libdvm.so 09-01 12:23:16.709: I/dalvikvm(884): #07 pc 0003dbe2 /system/lib/libdvm.so 09-01 12:23:16.709: I/dalvikvm(884): #08 pc 000f3bfa /data/app-lib/com.gba.emu- 1/libmain.so (SDL_Android_Init+549) 09-01 12:23:16.709: I/dalvikvm(884): #09 pc 000a7770 /data/app-lib/com.gba.emu-1/libmain.so (Java_org_libsdl_app_SDLActivity_nativeInit+3) 09-01 12:23:16.709: I/dalvikvm(884): #10 pc 0001dc4c /system/lib/libdvm.so (dvmPlatformInvoke+112) 09-01 12:23:16.739: I/dalvikvm(884): #11 pc 0004dcaa /system/lib/libdvm.so (dvmCallJNIMethod(unsigned int const*, JValue*, Method const*, Thread*)+393) 09-01 12:23:16.739: I/dalvikvm(884): #12 pc 000385e0 /system/lib/libdvm.so (dvmCheckCallJNIMethod(unsigned int const*, JValue*, Method const*, Thread*)+7) 09-01 12:23:16.739: I/dalvikvm(884): #13 pc 0004f696 /system/lib/libdvm.so (dvmResolveNativeMethod(unsigned int const*, JValue*, Method const*, Thread*)+181) 09-01 12:23:16.739: I/dalvikvm(884): #14 pc 00027060 /system/lib/libdvm.so 09-01 12:23:16.739: I/dalvikvm(884): #15 pc 0002b580 /system/lib/libdvm.so (dvmInterpret(Thread*, Method const*, JValue*)+184) 09-01 12:23:16.739: I/dalvikvm(884): #16 pc 0005fcbc /system/lib/libdvm.so (dvmCallMethodV(Thread*, Method const*, Object*, bool, JValue*, std::__va_list)+291) 09-01 12:23:16.749: I/dalvikvm(884): #17 pc 0005fce6 /system/lib/libdvm.so (dvmCallMethod(Thread*, Method const*, Object*, JValue*, ...)+19) 09-01 12:23:16.749: I/dalvikvm(884): #18 pc 00054a6e /system/lib/libdvm.so 09-01 12:23:16.749: I/dalvikvm(884): #19 pc 0000ca58 /system/lib/libc.so (__thread_entry+72) 09-01 12:23:16.749: I/dalvikvm(884): #20 pc 0000cbd4 /system/lib/libc.so (pthread_create+208) 09-01 12:23:16.749: I/dalvikvm(884): at org.libsdl.app.SDLActivity.nativeInit(Native Method) 09-01 12:23:16.749: I/dalvikvm(884): at org.libsdl.app.SDLMain.run(SDLActivity.java:704) 09-01 12:23:16.759: I/dalvikvm(884): at java.lang.Thread.run(Thread.java:841) 09-01 12:23:16.759: E/dalvikvm(884): VM aborting 

src文件夹中有2个包(“com.van.gba”和“org.libsdl.app”)。 jni中的所有内容都指向org.libsdl.app。 清单包名称是com.van.gba

当我改变com.van.gba时,它会中断。

所以我想知道,是什么导致了这个问题? 我无法在jni文件中找到对原始包名称(com.van.gba)的单一引用。

可以通过更改包层次结构和android清单包名称来模拟此错误。 (都称为com.van.gba)加载gba rom时会发生这种情况。

(注意:在编译jni之前,在文件夹“src”下的android.mk文件中将SDL2_image添加到LOCAL_STATIC_LIBRARIES + = zlib png(如此LOCAL_STATIC_LIBRARIES += zlib png SDL2_image ))

如果你看一下SDL_android_main.c ,你会发现,例如

 void Java_org_libsdl_app_SDLActivity_nativeInit(JNIEnv* env, jclass cls, jobject obj) { ... } 

它在包org.libsdl.app定义了类SDLActivity的本机方法。 如果重命名SDLActivity的包,则必须重命名.c文件中的所有此类函数。

另一方面,重命名APK包时,无需重命名Java类的包。 创建一个小的“本机包装”Java类通常也很方便,并将所有本机方法移动到此类; 然后从这个class级打电话给他们。 这与静态本机方法尤其相关。

====更新====

这是包名称硬连线的另一个地方:

请参阅com.van.gba.SelectGameActivity类

  String strTempPath = Environment.getExternalStorageDirectory().getAbsolutePath(); strTempPath += "/Android/data/"; strTempPath += SelectGameActivity.this.getPackageName(); File dir = new File(strTempPath); 

它正在寻找一些基于其包名的文件; 它假定其包名称等于APK包名称。 您的代码中可能有更多这样的地方。 当您修复它们后,您将能够重命名APK包。