更新到Android 5.0后的java.lang.UnsatisfiedLinkError

我正在开发一个
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本身.

最佳答案 在这里回答我自己的问题.您可以通过将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/

点赞