Смешение Android External JAR и JNI стало диким - PullRequest
3 голосов
/ 10 ноября 2010

Краткая история. пожалуйста, потерпите меня :) 1001 *

У меня есть проект Android, использующий JNI, который работает очень хорошо.

Я решил создать из источника этого проекта jni внешний jar (для распространения)

Чтобы создать эту банку, я воспользовался советом других и создал новый Java-проект, который содержит несколько классов jni, которые мне нужно сохранить в банке. Я экспортировал этот java-проект в jar (а не в janable)

Я создал новый проект Android, в котором я пытаюсь использовать рассматриваемый файл jar.

После того, как я поиграл с этим новым проектом Android, я понял, что файл .so, который должен сопровождать классы jni, не может находиться внутри самого файла jar (Eclipse пожаловался на это ..) Итак, я создал каталог lib внутри нового проекта Android, который содержит файл .so.

Когда я запускаю этот новый проект Android, я не могу работать ни с одним из классов, у которого есть нативные методы, и я могу работать только с теми классами, которые являются чистой реализацией Java.

Я продолжаю получать «ExceptionInInitializerError» при попытке создать экземпляр одного из объектов на основе jni.

Обновление: Кажется, что ошибка происходит при попытке загрузить библиотеку jni в строке

System.loadLibrary("lib-jni");

Вот логкат:

> ERROR/SightEngine(2479): About to load the lib-jni.so
ERROR/SightExample(2479): WARNING: Could not init SightEngine java.lang.ExceptionInInitializerError
ERROR/AndroidRuntime(2479): Uncaught handler: thread main exiting due to uncaught exception
ERROR/AndroidRuntime(2479): java.lang.RuntimeException: Unable to start activity ComponentInfo{eyesight.android.example/eyesight.android.example.SightExample}: java.lang.NullPointerException: println needs a message
ERROR/AndroidRuntime(2479):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2496)
ERROR/AndroidRuntime(2479):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2512)
ERROR/AndroidRuntime(2479):     at android.app.ActivityThread.access$2200(ActivityThread.java:119)
ERROR/AndroidRuntime(2479):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1863)
ERROR/AndroidRuntime(2479):     at android.os.Handler.dispatchMessage(Handler.java:99)
ERROR/AndroidRuntime(2479):     at android.os.Looper.loop(Looper.java:123)
ERROR/AndroidRuntime(2479):     at android.app.ActivityThread.main(ActivityThread.java:4363)
ERROR/AndroidRuntime(2479):     at java.lang.reflect.Method.invokeNative(Native Method)
ERROR/AndroidRuntime(2479):     at java.lang.reflect.Method.invoke(Method.java:521)
ERROR/AndroidRuntime(2479):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
ERROR/AndroidRuntime(2479):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
ERROR/AndroidRuntime(2479):     at dalvik.system.NativeStart.main(Native Method)
ERROR/AndroidRuntime(2479): Caused by: java.lang.NullPointerException: println needs a message
ERROR/AndroidRuntime(2479):     at android.util.Log.println(Native Method)
ERROR/AndroidRuntime(2479):     at android.util.Log.e(Log.java:208)
ERROR/AndroidRuntime(2479):     at eyesight.android.example.SightExample.onCreate(SightExample.java:28)
ERROR/AndroidRuntime(2479):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
ERROR/AndroidRuntime(2479):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2459)
ERROR/AndroidRuntime(2479):     ... 11 more
ERROR/dalvikvm(2479): Unable to open stack trace file '/data/anr/traces.txt': Permission denied

Несколько указателей:

  • Я вижу файл .so внутри файла .apk.
  • Я попытался определить внешний файл jar в JNI Android.mk, но ничего интересного не произошло. вот строки, которые я использовал (скомпилировано без проблем ..)

    LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES: = libtestjar: lib / testJar.jar включает $ (BUILD_MULTI_PREBUILT)

  • Я могу работать с обычными классами Java, которые существуют только в jar-файле. (Я знаю, что повторяюсь .. :)), что означает, что я правильно определил эту банку в проекте.

    • Проект Java, содержащий классы на основе jni, имеет ссылку на android.jar (уровень SDK 7)

У кого-нибудь есть предложения по поводу того, как можно решить эту задачу? Я чувствую, что я почти там ...

Спасибо за ваше время и усилия :) 1045 *

Итамар

Ответы [ 2 ]

1 голос
/ 21 октября 2011

В проекте Android вы поместили ваши .so файлы в lib / armeabi?

Кстати, у меня такая же настройка, как и у вас (проект Java, который создает JAR и проект Android, который используетбанку).

Мне удалось упаковать файлы .so в банку ... вот что я сделал:

- при создании JAR библиотеки я заархивирую файлы .so вфайл (скажем, armeabi.zip) и поместите его в папку «assets» в банке.

- при создании проекта android armeabi.zip будет находиться в папке «assets» внутри вашего apk.

- во время выполнения (первый запуск) Я извлекаю содержимое файла armeabi.zip из ресурсов в "/ data / data /" + context.getPackageName ().

- окончательно загружаю извлеченные файлы.поэтому libs использует System.load (/data/data//libfilename.so)

надеюсь, это поможет.

Фади

0 голосов
/ 11 ноября 2010

Похоже, что в журнале ошибок отсутствует сообщение.

ERROR/AndroidRuntime(2479): Caused by: java.lang.NullPointerException: println needs a message
ERROR/AndroidRuntime(2479): at android.util.Log.println(Native Method)
ERROR/AndroidRuntime(2479): at android.util.Log.e(Log.java:208)
ERROR/AndroidRuntime(2479): at eyesight.android.example.SightExample.onCreate(SightExample.java:28) 
...