Подтвердить что ты не робот

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

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

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

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

  1. добавить следующий контент в build.gradle

    defaultConfig: {... ndk {abiFilters "armeabi", "armeabi-v7a", "x86", "mips"}}

  2. добавить android.useDeprecatedNdk=true в gradle.properties

  3. добавьте новую папку с именем armeabi в libs, затем скопируйте 32- .so файл .so в новую папку

Ответ 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'
    }