【问题标题】:java.lang.UnsatisfiedLinkError after updating to Android 5.0更新到 Android 5.0 后的 java.lang.UnsatisfiedLinkError
【发布时间】:2014-11-28 17:02:10
【问题描述】:

我正在开发一个 Android 应用程序,它使用一个名为 liballjoyn_java.so 的本机库(Android Core SDK 中的 here 可用)。我使用 Android Studio 作为 IDE,使用 Maven 作为构建/依赖系统(不是 Gradle)。使用 Android KitKat,一切都像一个魅力,这就是我将库添加到我的项目的方式:

1) 将该库添加到我的本地 Maven 存储库中

mvn install:install-file -Dfile=./alljoyn/liballjoyn_java.so -DgroupId=org.alljoyn -DartifactId=liballjoyn_java -Dversion=14.06.00 -Dscope=runtime -Dpackaging=so

2) 在 POM 文件中定义了一个依赖:

        <dependency>
            <groupId>org.alljoyn</groupId>
            <artifactId>liballjoyn_java</artifactId>
            <scope>runtime</scope>
            <type>so</type>
            <version>14.06.00</version>
        </dependency>

3) 从我的代码中静态调用它:

static {
    try {
        System.loadLibrary("alljoyn_java");
        Log.d("AllJoynManager", "static - Loaded AllJoyn native library");
    } catch (Exception exception) {
        Log.d("AllJoynManager", "static - Error loading AllJoyn native library");
        exception.printStackTrace();
    }
}

这在我的 Nexus 4 手机的 KitKat 下完美运行,但现在我安装了官方的 Android 5.0 OTA 更新,运行时出现以下错误:

11-28 17:57:39.988  30068-30068/com.avispalabs.kiihome E/AndroidRuntime﹕ FATAL EXCEPTION: main
    Process: com.avispalabs.kiihome, PID: 30068
    java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/com.avispalabs.kiihome-2/base.apk"],nativeLibraryDirectories=[/data/app/com.avispalabs.kiihome-2/lib/arm, /vendor/lib, /system/lib]]] couldn't find "liballjoyn_java.so"
            at java.lang.Runtime.loadLibrary(Runtime.java:366)
            at java.lang.System.loadLibrary(System.java:989)
            at com.avispalabs.kiihome.helpers.network.alljoyn.AlljoynManager.<clinit>(AlljoynManager.java:38)
            at com.avispalabs.kiihome.ui.activities.MainActivity.<init>(MainActivity.java:38)
            at java.lang.reflect.Constructor.newInstance(Native Method)
            at java.lang.Class.newInstance(Class.java:1572)
            at android.app.Instrumentation.newActivity(Instrumentation.java:1065)
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2199)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2360)
            at android.app.ActivityThread.access$800(ActivityThread.java:144)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1278)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:135)
            at android.app.ActivityThread.main(ActivityThread.java:5221)
            at java.lang.reflect.Method.invoke(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:372)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)
11-28 17:57:55.432  30068-30068/com.avispalabs.kiihome I/Process﹕ Sending signal. PID: 30068 SIG: 9

我怀疑 .so 库的编译方式可能与新的 Android 5.0 ART (?) 不兼容。说找不到库的消息可能具有误导性(当库无法加载时也会出现异常),但我不确定(另一种可能性是 .so 未正确提取或放置)。

该库经过预编译,并被宣传为与 JellyBean 兼容。我以为以前的动态库会兼容新版本的Android,否则很多应用程序会崩溃。如果我在带有 KitKat 的 Nexus 4 中安装相同的 APK,它就可以工作。

非常感谢任何建议。

更新:我已经在基于 KitKat 的设备中测试了我的项目,并将运行时切换到 ART 而不是 Dalvik,并且项目运行良好。这个问题似乎与 Android 5 而不是 ART 本身有关。

【问题讨论】:

  • “如果我在带有 KitKat 的 Nexus 4 中安装相同的 APK,它就可以正常工作”——您是否在 Nexus 4 的开发人员选项中启用了 ART?如果没有,请尝试。 ART 最有可能是罪魁祸首,您需要获取更新的库:developer.android.com/guide/practices/verifying-apps-art.html
  • 你的意思是如果 ART 是罪魁祸首,那么在带有 KitKat 的 Nexus 4 上启用 ART 应该会触发这个问题?我可以测试一下,看看会发生什么......
  • “你的意思是如果 ART 是罪魁祸首,那么在带有 KitKat 的 Nexus 4 上启用 ART 应该会触发这个问题?” - 是的。现在,ART 本身可能在 4.4 和 5.0 之间发生了一些变化,因此问题可能与 5.0 的 ART 相关。但是,如果您的应用在 4.4 上使用 Dalvik 并且在 4.4 上使用 ART 时失败,这是一个非常积极的信号,表明问题与 ART 相关。
  • 嗨@CommonsWare。我尝试了您的建议,当从开发设置切换 KitKat 设备以使用 ART 时,该库仍然有效。所以 ART 似乎不是罪魁祸首,它在某种程度上更像是 Android 5.0。由于该库在 ART 下工作,因此它可能与库的位置有关。还有什么建议吗?
  • “还有什么建议吗?” ——我猜想和 AllJoyn 的人谈谈。 SO 上只有 44 个标记为 alljoyn 的问题,所以希望还有一些其他的 AllJoyn 支持板可能更有用。

标签: android maven unsatisfiedlinkerror alljoyn


【解决方案1】:

在这里回答我自己的问题。您可以通过将 liballjoyn_java 编译为 PIE 来解决它,如下所述:

https://jira.allseenalliance.org/browse/ASACORE-1208

在 AllJoyn 人员发布新的 Android 版本之前,这是一种解决方法。请留意此处以获取更新版本:

https://build.allseenalliance.org/ci/view/Core%20RB14.12%20SDK/job/branch-android-sdk/

【讨论】:

    猜你喜欢
    • 2021-05-24
    • 1970-01-01
    • 2015-02-05
    • 1970-01-01
    • 1970-01-01
    • 2021-08-06
    • 2019-05-11
    • 2015-05-31
    • 1970-01-01
    相关资源
    最近更新 更多