2010-11-10 4 views
2

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

+0

Que montre logcat? – fadden

+0

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

+0

Comment votre .so construit-il? La bibliothèque native doit être construite pour ARM (par ndk) – qrtt1

Répondre

0

On dirait un appel du journal d'erreur manque un message.

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) 
+0

10x, En effet, il y avait une tentative de Log.e lors de l'interception de l'exception qui avait null. Cependant, ce n'est pas le problème et je reçois toujours ExceptionInInitializerError. – Ita

1

Dans le projet android, avez-vous placé vos fichiers .so sous lib/armeabi? En passant, j'ai la même configuration que vous (projet java qui construit un pot et un projet Android qui utilise le pot).

j'ai réussi à emballer les fichiers .so dans le bocal ... voici ce que je l'ai fait:

-Lorsque construction de la bibliothèque JAR, je zip les fichiers .so dans un fichier (par exemple armeabi.zip) et mettez-le dans un dossier 'assets' dans le pot. -lors de la construction du projet android, le fichier armeabi.zip sera dans le dossier 'assets' de votre apk. Runtime (premier démarrage) J'extrais le contenu de armeabi.zip des assets dans "/ data/data /" + context.getPackageName().

charger -Enfin l'extrait .donc libs en utilisant System.load (/data/data//libfilename.so)

espérons que cette aide.

Fadi