2015-09-09 127 views
0

我有一個原生的Android應用程序(NativeActivity,沒有java代碼,但只libMyApp.so本地庫)在4.2 4.3,但負荷加載本地庫無法在最新版本

該應用程序運行完全在Android 5.0.1和5.1 0.1,但崩潰在Android 4.3和4.2.2

對於5.0.1和5.1.1版本從

  • /data/data/com.example.myapp/lib/libMyApp.so
順利加載 .so LIB

4.3和4.2.2版本試圖從一個加載以下位置

  • /data/app-lib/com.example.myapp-1/libMyApp.so
  • /data/app-lib/com.example.myapp-2/libMyApp.so

該錯誤消息是

FATAL EXCEPTION: main 
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.myapp/android.app.NativeActivity}: java.lang.IllegalArgumentException: Unable to load native library: /data/app-lib/com.example.myapp-2/libMyApp.so 
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2295) 
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2349) 
    at android.app.ActivityThread.access$700(ActivityThread.java:159) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1316) 
    at android.os.Handler.dispatchMessage(Handler.java:99) 
    at android.os.Looper.loop(Looper.java:176) 
    at android.app.ActivityThread.main(ActivityThread.java:5419) 
    at java.lang.reflect.Method.invokeNative(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:525) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1046) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:862) 
    at dalvik.system.NativeStart.main(Native Method 

我的應用程序有一個單一的共享庫即不依賴於第三方庫。

和模塊名稱在清單文件中指定這樣的

<meta-data android:name="android.app.lib_name" 
      android:value="MyApp" /> 

libMyApp.so-llog -lGLESv3 -lGLESv2 -lGLESv1_CM -lEGL -landroid -lz庫鏈接。

爲什麼lib不能加載,我錯過了什麼?

爲什麼舊的android版本不能從/data/data/com.example.myapp/lib/加載?

較舊的android版本是否有另一個模塊命名約定?

+0

檢查的logcat從動態鏈接器的消息。 – fadden

+0

@fadden沒有任何鏈接信息。有沒有鏈接器日誌記錄級別可以提升到和如何? – deimus

回答

0

經過2天的研究,我終於找到了問題的根源。

首先莫名其妙本機應用程序不顯示完整鏈接錯誤在logcat中 - (!我不知道爲什麼

但相同的應用程序轉換爲Java/JNI的應用程序後,我能看到僅在L(5. *)之前的Android版本中出現鏈接器錯誤。

的dlopen( 「/ data/app中-LIB/com.example.myapp/libMyApp.so」)失敗:dlopen的 失敗:無法找到符號 「函數srand」 由 「libMyApp.so」 引用...

我用來從r10e ndk編譯android-21 api級別的cpp代碼。

這基本上不能保證應用程序將確定在Android版之前L.

運行下面是官方Android bug report

正如我在本機應用程序中使用OGLES3.1功能,我無法從21下調目標SDK的水平,所以我沒有選擇比更新分鐘SDK級到21

+1

錯誤信息由'dlerror()'返回,而不是直接寫入日誌。您看到它與Java應用程序,因爲該虛擬機記錄失敗。 (對不起,我早些時候請求你檢查日誌時,我忘了那部分內容。) – fadden

0

你有沒有像這樣在你的課堂中加載你的圖書館?

static { 
     System.loadLibrary("nativeLib"); 
    } 
+0

哦! NativeActivity,沒有Java代碼! – deimus