2014-08-31 3 views
2

Я модифицирования и играть с этим проектом:Изменение имени пакета Android манифеста вызывает проблемы JNI

исходный код: https://bitbucket.org/viet0904163136/gba-android/src

Это эмулятор GameBoy Advance под лицензией GPLv2. Все работает нормально до тех пор, пока я не изменю имя пакета в файле манифеста 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, это ломается.

Так что мне интересно, что вызывает эту проблему? Я не могу найти ни одного упоминания об исходном имени пакета (com.van.gba) в jni-файлах.

Эта ошибка может быть смоделирована путем изменения иерархии пакетов и имени пакета манифеста android. (оба называются com.van.gba) Это произойдет при загрузке gba rom.

(примечание: перед компиляцией JNI добавить SDL2_image к LOCAL_STATIC_LIBRARIES + = Zlib PNG (как это LOCAL_STATIC_LIBRARIES += zlib png SDL2_image) в android.mk файл в папке "Src")

+0

Какая версия Android? Уровень детализации в предупреждениях JNI со временем улучшился, поэтому возможно, что более новая версия Android даст более полезное сообщение. – fadden

+0

Я использовал api level 12, теперь переключи его на 19. И действительно более описательное сообщение. Я собираюсь отредактировать сообщение и попытаться понять его. благодаря! –

+0

Похож на 'SDL_Android_Init()', вызываемый из 'Java_org_libsdl_app_SDLActivity_nativeInit()', передает аргумент null 'jclass'' GetStaticMethodID'. Вероятно, это результат неспособности найти класс, а затем передать результат «FindClass» вместе без проверки на ошибку. – fadden

ответ

0

Если вы посмотрите на SDL_android_main.c, вы найдете , например

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

Что определяет нативный метод класса SDLActivity в пакете org.libsdl.app. Вы должны переименовать все такие функции в файлы .c, если пакет SDLActivity переименован.

С другой стороны, нет необходимости переименовывать пакет класса Java при переименовании пакета APK. Также часто бывает удобно создать небольшой класс «native wrapper» 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. Но все же он ломается из-за изменения имени пакета манифеста android. И я не мог понять, какое имя пакета объявлений Android имеет отношение к файлам в JNI. (Я не смог найти ни одного комментария к com.van.gba в JNI –

+0

Извините, я неправильно понял вашу проблему. См. Обновленный ответ. –

+0

да, этот каталог создан для хранения файлов сохранения и загрузки их. Когда я изменил манифест apk, я также переименовал/реорганизовал пакет иерархии с равным именем com.van.gba. Поэтому я не думаю, что проблема должна быть связана с этим, потому что имя пакета не жестко закодировано нигде. Спасибо за вашу помощь и время Я искал и пытался найти решение, например, через 8 часов: P Это действительно странно и разочаровывает. Ошибка при вызове SDL_Android_Init с сообщением выше. Предупреждение JNI: получено null jclass .. –

Смежные вопросы