Как использовать 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-битными целями?


person Philipp E.    schedule 11.06.2015    source источник
comment
Вы смотрели на stackoverflow.com/q/27712921/603270 и stackoverflow.com/a/29329413/603270 ?   -  person shkschneider    schedule 11.06.2015
comment
Я сделал. Один относится к AOSP, другой — к динамической загрузке классов. Мой случай на самом деле гораздо проще. Но я только что обнаружил, что другая нативная библиотека, которую я включил, действительно предоставляет 64-битные файлы .so, поэтому в моей папке /lib в финальном apk есть папка arm64-86. Вероятно, поэтому система предполагает, что я во всех случаях предоставляю 64-битные файлы .so. Я попытаюсь перекомпилировать эту библиотеку только с 32-битной поддержкой и посмотреть, работает ли она.   -  person Philipp E.    schedule 11.06.2015
comment
Хорошая мысль. Дайте нам знать (ответьте на свой вопрос, если необходимо).   -  person shkschneider    schedule 12.06.2015
comment
tools.android. com/tech-docs/new-build-system/user-guide/   -  person Junior Buckeridge    schedule 09.10.2015


Ответы (2)


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

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

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

android {
    ....
    defaultConfig {
        ....
        ndk {
            abiFilters "armeabi", "armeabi-v7a", "x86", "mips"
        }
    }
}
person ph0b    schedule 12.06.2015
comment
Выглядит хорошо, 64-битные папки исчезли с этим фрагментом. Я отмечу ответ как принятый, как только найду 64-битный телефон для воспроизведения - person Philipp E.; 12.06.2015
comment
tools.android. com/tech-docs/new-build-system/user-guide/ - person Junior Buckeridge; 09.10.2015
comment
Получение ошибки Интеграция NDK устарела в текущем плагине. Подумайте о том, чтобы попробовать новый экспериментальный плагин. - person Umesh Aawte; 25.11.2015
comment
добавьте android.useDeprecatedNdk=true в файл с именем gradle.properties в корне вашего проекта. Кстати, не расстраивайтесь из-за использования устаревшей интеграции, так как использование abiFilters по-прежнему остается самым чистым способом фильтрации 64-битных библиотек из APK. - person ph0b; 30.11.2015
comment
Спасибо @ph0b, это решает совершенно другую проблему, с которой я боролся несколько дней :) - person ssantos; 11.10.2016
comment
@ ph0b Вы должны сделать отдельный ответ. Это плохо видно, и это тоже решило мою проблему :) - person Silviu St; 04.09.2017
comment
@ ph0b У меня проблема с двумя разными файлами so, которые я использовал, если я установил фильтр ndk api на abiFilters "arm64-v8a","armeabi", "armeabi-v7a", "x86","x86_64", "mips", тогда первый файл работает нормально, а второй файл не загружается, и если я установил abiFilters "armeabi", "armeabi-v7a", "x86", "mips", то сначала загрузка хранилища файлов, но второй файл работает нормально не могли бы вы предоставить какое-либо решение - person Om Infowave Developers; 06.09.2017
comment
На сегодняшний день (1 августа 2019 г.) вы не можете отправлять APK в Google Play Store без 64-битной архитектуры. - person Joshua Pinter; 01.08.2019
comment
Добавление этого в файл build.gradle моего приложения помогло мне :) - person Augusto Carmo; 15.01.2020

Приведенный выше ответ поможет создать сборку только с 32-разрядной версией, а не с 64-разрядной. Если вы используете [ abiFilters "armeabi", "armeabi-v7a", "x86", "mips" ]. сгенерировать подписанный apk означает, что не для 64 бит. Это вызовет ошибку, когда мы загрузим в магазин Google Play. Это не 64-битная сборка.

person Arun Kumar    schedule 17.09.2019