Использование 32-разрядных jni-библиотек на 64-битном Android-устройстве

Я попытался запустить приложение, используя собственную библиотеку на Nexus 9.

Приложение выходит с сообщением об ошибке:

java.lang.UnsatisfiedLinkError: dlopen failed: "lib_xyz.so" is 32-bit instead of 64-bit 

Существует ли какое-либо известное обходное решение для этой проблемы (за исключением, конечно, перекомпиляции библиотеки и увеличения apk)?

Solutions Collecting From Web of "Использование 32-разрядных jni-библиотек на 64-битном Android-устройстве"

Нашел объяснение: 64-битный Android может использовать 32-разрядные собственные библиотеки в качестве резервной копии, только если System.loadlLibrary () не может найти ничего лучшего в пути поиска по умолчанию. Вы получаете UnsatisfiedLinkError, если вы заставляете систему загружать 32-битную библиотеку с помощью System.load () с полным пути к библиотеке. Поэтому первым обходным решением является System.loadLibrary () вместо System.load ().

Еще одна вещь, которая должна быть принята во внимание, заключается в том, что библиотеки не могут быть смешаны: резервное поведение применяется только для первой библиотеки, загруженной вашим приложением. Если первый из них 64-битный, 32-битные библиотеки не могут быть загружены одним и тем же приложением и наоборот.

Дело в том, чтобы преобразовать среду выполнения в 32-разрядную

  1. Добавьте следующий контент в 'build.gradle' 'defaultConfig': ndk {abiFilters "armeabi", "armeabi-v7a", "x86", "mips"}
  2. Добавить android.useDeprecatedNdk = true в gradle.properties
  3. Добавьте новую папку с именем armeabi под libs, затем скопируйте 32-битный файл «.so» в новую папку

https://source.android.com/source/64-bit-builds.html

Попробуйте это в Android.mk

 LOCAL_MULTILIB := 32 

Nop, вам нужно, чтобы родная библиотека была совместима с 64-битным, чтобы она работала.

См. Официальную документацию: Советы JNI: 64-битные соображения

Я столкнулся с той же проблемой, когда я сделал обновление с 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.