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