Используйте 32-разрядные библиотеки jni на 64-битном Android-устройстве
Я попытался запустить приложение, используя собственную библиотеку на Nexus 9.
Приложение выходит с сообщением об ошибке:
java.lang.UnsatisfiedLinkError: dlopen failed: "lib_xyz.so" is 32-bit instead of 64-bit
Существует ли какое-либо известное обходное решение для этой проблемы (за исключением, конечно, перекомпиляции библиотеки и увеличения apk)?
Ответы
Ответ 1
Обнаружено объяснение: 64-разрядный Android может использовать 32-разрядные собственные библиотеки в качестве резервной копии, только если System.loadlLibrary() не может найти ничего лучшего в пути поиска по умолчанию.
Вы получаете UnsatisfiedLinkError, если вы заставляете систему загружать 32-битную библиотеку с помощью System.load() с полным пути к библиотеке.
Таким образом, первым обходным решением является System.loadLibrary() вместо System.load().
Еще одна вещь, которая должна быть учтена, заключается в том, что библиотеки не могут быть смешаны: резервное поведение применяется только для первой библиотеки, загруженной вашим приложением. Если первый из них 64-разрядный, 32-битные библиотеки не могут быть загружены одним и тем же приложением и наоборот.
Ответ 2
дело в том, чтобы преобразовать среду выполнения в 32-разрядную
-
добавить следующий контент в build.gradle
defaultConfig: {... ndk {abiFilters "armeabi", "armeabi-v7a", "x86", "mips"}}
-
добавить android.useDeprecatedNdk=true
в gradle.properties
- добавьте новую папку с именем armeabi в libs, затем скопируйте 32-
.so
файл .so
в новую папку
Ответ 3
https://source.android.com/source/64-bit-builds.html
Попробуйте это в Android.mk
LOCAL_MULTILIB := 32
Ответ 4
Nop, вам нужно, чтобы родная библиотека была совместима с 64-битным, чтобы она работала.
См. официальную документацию: Советы JNI: 64-битные соображения
Ответ 5
Я столкнулся с той же проблемой, когда я сделал обновление с Android Studio 2.1 до 2.2.3 (с ndk v.13.1), и никакие подсказки, найденные в google, не помогли мне (например, с помощью abiFilters, exclude 'lib/x86_64/lib....so, LOCAL_MULTILIB: = 32 или TARGET_PREFER_32_BIT: = true,...).
Наконец, я смог снова работать с последней версией AS v2.2.3 (без изменения чего-либо в Android.mk или build.gradle), просто используя мой предыдущий компилятор ndk, то есть android-ndk-r10e
Я построил библиотеку вручную с помощью ndk-build для "armeabi-v7a" и "x86", и он работал как шарм на Android с arm64.
Ответ 6
Для меня проблема заключалась в том, что я включил расширенную функцию профилирования в настройках сборки приложения
Ответ 7
Эта работа для меня:
ndk {
abiFilters 'armeabi-v7a', 'x86'
}