2010-11-10 61 views
2

簡短的歷史。請耐心等待:)混合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級)

有沒有人有任何建議,有這個任務如何完成?我覺得我幾乎沒有...

感謝您的時間和精力:)

伊塔馬爾

+0

是什麼logcat的表現? – fadden 2010-11-10 20:24:52

+0

logcat添加。此外,生成.so文件的Android.mk文件的當前版本與PREBUILT_STATIC_JAVA_LIB一起使用。我不確定這是否是必要的,因爲我沒有編譯對應於外部jar的.so,而是僅將jni的Java端編譯爲jar。說得通? – Ita 2010-11-11 09:46:13

+0

你的.so如何構建?本地庫應該爲ARM構建(由ndk) – qrtt1 2010-11-11 09:48:26

回答

0

看起來像一個錯誤日誌呼叫丟失了消息。

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

10倍,確實有一個Log.e嘗試捕捉其中有空的異常。然而,這不是問題,我仍然得到ExceptionInInitializerError。 – Ita 2010-11-15 13:29:55

1

在android項目中,您是否將lib文件放在lib/armeabi下?順便說一下,我的設置和你一樣(構建一個jar和一個使用jar的android項目的java項目)。

我設法包裝罐中的.so文件......這裏就是我所做的:

- 當構建庫JAR,我壓縮的.so文件,到文件(比如armeabi.zip)和將它放在jar中的'assets'文件夾中。

- 當構建Android項目時,armeabi.zip將位於apk內的'assets'文件夾中。

-at運行時(第一次啓動)我從資產中提取armeabi.zip的內容到「/ data/data /」+ context.getPackageName()中。

- 最後加載使用System.load(/data/data//libfilename.so)

希望這有助於提取的.so庫。

法迪