繁体   English   中英

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

[英]Changing package name android manifest causes problems JNI

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

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

这是GPLv2许可的Gameboy高级仿真器。 一切正常,直到我更改android manifest文件中的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 manifest包名称来模拟此错误。 (均称为com.van.gba)。加载gba rom时会发生这种情况。

(请注意:在编译jni之前,请将android.mk文件中的LOCAL_STATIC_LIBRARIES += zlib png 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类并将所有本机方法移到该类通常也很方便。 然后从这个班级叫他们。 这对于静态本机方法尤其重要。

====更新====

这是软件包名称硬连接的另一个地方:

参见类com.van.gba.SelectGameActivity

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

它根据其程序包名称查找一些文件; 假设其软件包名称等于APK软件包名称。 您的代码中可能还有更多类似的地方。 修复它们后,您将可以重命名APK软件包。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM