2015-09-09 96 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