我一直在修改,並與該項目打轉轉:更改包名的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文件)
什麼版本的Android?隨着時間的推移,JNI警告中的細節水平普遍有所提高,所以有可能新版Android會提供更有用的信息。 – fadden 2014-09-01 15:27:55
我正在使用API級別12,現在將其切換爲19.確實是一個更具描述性的消息。我要編輯帖子並嘗試找出結果。謝謝! – 2014-09-01 16:47:04
看起來像從'Java_org_libsdl_app_SDLActivity_nativeInit()'調用的'SDL_Android_Init()',正在向'GetStaticMethodID'傳遞一個空的'jclass'參數。可能是因爲沒有找到一個類,然後傳遞FindClass的結果而沒有檢查錯誤。 – fadden 2014-09-01 18:36:02