2014-08-31 56 views
2

我一直在修改,并与该项目打转转:更改包名的Android清单导致问题JNI

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

这是在GPLv2许可下一个GameBoy Advance的模拟器。每件事情都可以正常工作,直到我更改了Android清单文件中的包名。

如果未更改软件包名称,则应用程序可以正常工作。但是,当包名改变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 

有2包src文件夹中(“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前添加SDL2_image到LOCAL_STATIC_LIBRARIES + = zlib的PNG(这样LOCAL_STATIC_LIBRARIES += zlib png SDL2_image)在文件夹 “src” 下面的android.mk文件)

+0

什么版本的Android?随着时间的推移,JNI警告中的细节水平普遍有所提高,所以有可能新版Android会提供更有用的信息。 – fadden 2014-09-01 15:27:55

+0

我正在使用API​​级别12,现在将其切换为19.确实是一个更具描述性的消息。我要编辑帖子并尝试找出结果。谢谢! – 2014-09-01 16:47:04

+0

看起来像从'Java_org_libsdl_app_SDLActivity_nativeInit()'调用的'SDL_Android_Init()',正在向'GetStaticMethodID'传递一个空的'jclass'参数。可能是因为没有找到一个类,然后传递FindClass的结果而没有检查错误。 – fadden 2014-09-01 18:36:02

回答

0

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

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

其中定义在包org.libsdl.appSDLActivity类的本地方法。如果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软件包。

+0

是的,这是真的,但代码是这样构造的。所有的本地方法都指向org.libsdl.app。(SDLActivity)而我没有改变这个我只改变了包名(com.van.gba)在清单和包层次结构(com.van.gba)中。我没有编辑org.libsdl.app包层次结构。这是我的问题,没有本地方法指向com.van.gba.But仍然因为Android清单包名称更改而中断。我无法弄清楚清单包名称与JNI中的文件有什么关系。 (我在JNI – 2014-09-01 08:27:51

+0

中找不到com.van.gba的一个引用对不起,我误解了你的问题,请参阅更新后的答案 – 2014-09-01 08:54:53

+0

是的,该目录被创建用于存储保存文件并加载它们。 apk包名称我也重命名/重构层次结构包与平等名称com.van.gba。所以我不认为应该有一个问题,因为软件包的名称是不硬编码的其他地方感谢您的帮助和时间。我一直在寻找并试图找到一个类似于8小时的解决方案:P它真的很奇怪,令人沮丧,用上面的消息调用SDL_Android_Init时出现错误JNI警告:收到null jclass .. – 2014-09-01 11:00:16