簡短的歷史。請耐心等待:)混合Android外部JAR和JNI狂野
我有一個使用JNI的Android項目,效果很好。
我決定創造出這個JNI項目外部的jar(分配)
爲了創建這個罐子我已經採取了別人的建議,並創建了一個新的Java項目的來源是擁有我需要存儲在jar中的幾個jni類。我已經將這個Java項目導出到jar(而不是作爲可運行的jar)
我創建了一個新的Android項目,我嘗試使用有問題的jar文件。
當我玩這個新的android項目後,我發現應該陪伴jni類的.so文件不能駐留在jar文件本身(Eclipse抱怨它)。所以我已經在包含.so文件的新Android項目中創建一個lib目錄。
當我運行這個新的Android項目時,我無法使用任何具有本地方法的類,而且我只能使用那些純Java實現的類。
當我試圖創建一個基於jni的對象的實例時,我總是收到「ExceptionInInitializerError」。
更新: 看來,錯誤來自試圖加載JNI庫線
System.loadLibrary("lib-jni");
這裏是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
幾個要點:
- 我可以在.apk文件中看到.so文件。
我已經嘗試在JNI Android.mk中定義外部jar文件,但沒有發生任何令人興奮的事情。 = libtestjar:LIB/testJar.jar 包括$(BUILD_MULTI_PREBUILT)
我能夠與普通的Java類在這裏工作是我所使用的線
LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES(它沒有問題..編譯)只存在於jar文件中。 (我知道我在重複自己.. :))這意味着我已經在項目中正確定義了這個jar。
- 持有基於JNI類的Java項目具有對的android.jar參考(SDK 7級)
有沒有人有任何建議,有這個任務如何完成?我覺得我幾乎沒有...
感謝您的時間和精力:)
伊塔馬爾
是什麼logcat的表現? – fadden 2010-11-10 20:24:52
logcat添加。此外,生成.so文件的Android.mk文件的當前版本與PREBUILT_STATIC_JAVA_LIB一起使用。我不確定這是否是必要的,因爲我沒有編譯對應於外部jar的.so,而是僅將jni的Java端編譯爲jar。說得通? – Ita 2010-11-11 09:46:13
你的.so如何構建?本地庫應該爲ARM構建(由ndk) – qrtt1 2010-11-11 09:48:26