Un bref historique. s'il vous plaît ours avec moi :)Mixage Android JAR externe et JNI devenu sauvage
J'ai un projet Android qui utilise JNI qui fonctionne très bien.
J'ai décidé de créer à partir de la source de ce projet JNI un pot externe (pour la distribution)
Afin de créer ce pot que j'ai pris les conseils des autres et créé un nouveau projet Java tient les quelques classes de jni que j'ai besoin de stocker dans le pot. J'ai exporté ce projet java dans un pot (pas comme un pot exécutable)
J'ai créé un nouveau projet Android dans lequel j'essaie d'utiliser le fichier jar en question. Après avoir joué avec ce nouveau projet android, je me suis rendu compte que le fichier .so qui devrait accompagner les classes jni ne peut pas résider dans le fichier jar lui-même (Eclipse se plaignait à ce sujet ..) Donc j'ai créé un répertoire lib dans le nouveau projet Android qui contient le fichier .so. Lorsque je lance ce nouveau projet Android, je ne peux pas travailler avec l'une des classes qui a des méthodes natives, et je ne peux travailler qu'avec les classes qui sont pure implémentation Java.
Je continue d'obtenir "ExceptionInInitializerError" lorsque j'essaie de créer une instance d'un des objets basés sur jni.
Mise à jour: Il semble que l'erreur vient d'essayer de charger la bibliothèque JNI en ligne
System.loadLibrary("lib-jni");
Voici le logcat:
> 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
Quelques conseils:
- Je peux voir le fichier .so dans le fichier .apk.
J'ai essayé de définir le fichier jar externe dans le JNI Android.mk mais rien d'excitant n'est arrivé. ici sont les lignes que j'ai utilisé (il compilé sans problème ..)
LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES: = libtestjar: lib/testJar.jar comprennent $ (BUILD_MULTI_PREBUILT)
Je suis en mesure de travailler avec des classes java régulières qui existent seulement dans le fichier jar. (Je sais que je me répète .. :)) ce qui signifie que j'ai correctement défini ce pot dans le projet.
- Le projet java qui détient les classes à base de JNI a une référence à la android.jar (sdk niveau 7)
Est-ce que quelqu'un a des suggestions a sur la façon dont cette tâche peut être accomplie ? Je sens que je suis presque ...
Merci pour votre temps et d'efforts :)
Itamar
Que montre logcat? – fadden
logcat ajouté. Aussi la version actuelle du fichier Android.mk qui a produit le fichier .so est avec le PREBUILT_STATIC_JAVA_LIB. Je ne suis pas sûr si c'est même nécessaire parce que je ne compile pas le .so par rapport à un pot externe, mais compile seulement le côté Java du jni dans un pot. logique? – Ita
Comment votre .so construit-il? La bibliothèque native doit être construite pour ARM (par ndk) – qrtt1