【问题标题】:Unable to load native library on 4.2 4.3 but loads on recent versions无法在 4.2 4.3 上加载本机库,但在最新版本上加载
【发布时间】:2015-12-05 11:07:22
【问题描述】:

我有一个原生 android 应用程序(NativeActivity,没有 java 代码,只有 libMyApp.so 原生库)

该应用在 Android 5.0.1 和 5.1.1 上完美运行,但在 android 4.3 和 4.2.2 上崩溃

对于 5.0.1 和 5.1.1 版本,从

成功加载 .so
  • /data/data/com.example.myapp/lib/libMyApp.so

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 库链接。

为什么无法加载库,我缺少什么?

为什么不从/data/data/com.example.myapp/lib/ 加载旧的android 版本?!

较旧的 android 版本是否有其他模块命名约定?

【问题讨论】:

  • 检查 logcat 是否有来自动态链接器的消息。
  • @fadden 没有任何链接器消息。是否有可以提升到的链接器日志记录级别以及如何提升?

标签: android android-ndk native-activity


【解决方案1】:

你有没有像这样在课堂上加载你的库?

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

【讨论】:

    【解决方案2】:

    经过2天的研究,我终于找到了问题的根源。

    首先不知何故 Native App 在 logcat 中没有显示完整的链接器错误 - (我不知道为什么!

    但是在将同一个应用程序转换为 Java/JNI 应用程序后,我只能在 L (5.*) 之前的 Android 版本上看到以下链接器错误。

    dlopen("/data/app-lib/com.example.myapp/libMyApp.so") 失败:dlopen 失败:找不到“libMyApp.so”引用的符号“srand”...

    我曾经从r10e ndk编译带有android-21 api级别的cpp代码。

    这基本上不能保证应用程序在 L 之前的 android 版本上运行正常。

    这里是官方安卓bug report

    由于在我的原生应用程序中使用了OGLES3.1 功能,我无法将目标 SDK 级别从 21 降级,因此我别无选择,只能将 min sdk 级别更新为 21。

    【讨论】:

    • 错误信息是dlerror()返回的,没有直接写入日志。您在 Java 应用程序中看到了它,因为 VM 记录了故障。 (抱歉,我之前让你检查日志时忘记了那部分。)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-06
    • 1970-01-01
    • 2012-08-01
    • 1970-01-01
    • 2014-05-06
    • 1970-01-01
    相关资源
    最近更新 更多