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

Я использую встроенную библиотеку в своем приложении, которая компилируется только для armeabi, armeabi-v7a и x86.

Когда эта библиотека загружается на 64-битном устройстве, таком как Samsung S6, приложение вылетает с UnsatisfiedLinkError

java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/com.myapp-2/base.apk"],nativeLibraryDirectories=[/data/app/com.myapp-2/lib/arm64, /vendor/lib64, /system/lib64]]] couldn't find "libfoo.so"
    at java.lang.Runtime.loadLibrary(Runtime.java:366)
    at java.lang.System.loadLibrary(System.java:989)

К сожалению, библиотека закрыта. Есть ли способ исправить это без перекомпиляции библиотеки с 64-битными целями?

Ответ 1

Когда вы устанавливаете APK на Android, система будет искать каталоги для родных библиотек (armeabi, armeabi-v7a, arm64-v8a, x86, x86_64, mips64, mips) внутри папки lib APK, в порядок определяется Build.SUPPORTED_ABIS.

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

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

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