java.lang.UnsatisfiedLinkError после обновления до Android 5.0
Я разрабатываю приложение для 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();
}
}
Это отлично работало под KitKat в моем телефоне Nexus 4, но теперь я установил официальное обновление 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, в противном случае многие приложения сломаются. Если я устанавливаю тот же APK в Nexus 4 с KitKat, он просто работает.
Любой совет высоко ценится.
ОБНОВЛЕНИЕ: я протестировал свой проект на устройстве на основе KitKat и переключил среду выполнения на ART, а не на Dalvik, и проект работает нормально. Эта проблема, кажется, связана с Android 5, а не с самим ART.
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/