我正在开发一个 Android 应用程序,它使用一个名为 liballjoyn_java.so 的本机库(在 Android Core SDK 中可用)。我使用 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 本身有关。