Я создаю устаревшее приложение для Android 6 и выше. Мне нужно включить некоторые файлы .so, созданные для архитектуры "armeabi". У меня нет исходного кода для этих общих объектов, поэтому я не могу создать их для других архитектур.
Архитектуры целевых устройств — «armeabi-v7a» и «arm64-v8a». Оба устройства могут запускать собственные двоичные файлы для «armeabi», я проверил это с помощью adb (Как узнать версию процессора ARM на устройстве Android?).
Файлы .so находятся в «/app/src/main/jniLibs/armeabi/****.so», но во время выполнения я получаю «JNI: неудовлетворенная ошибка ссылки», поэтому он их не использует.
Как я могу заставить устройство использовать эти файлы, хотя они не оптимизированы для среды выполнения, но единственные файлы, к которым я могу получить доступ.
Спасибо за любую помощь.
Я использую Android Studio 2021, Gradle 7, minSdkVersion 21, targetSdkVersion 31, compileSdkVersion 31.
Большое спасибо за ваш ответ. Извлеченный APK включает файлы .so в каталоге armeabi. Это единственный каталог в папке lib. Если я переименую каталог в «ameabi-v7a», он будет работать на более старом устройстве. Но если я переименую его в «arm64-v8a», другое устройство будет думать, что библиотеки 64-битные, но они 32-битные. Моя проблема в том, что устройства не ищут каталог "armeabi".
У вас должна быть возможность переименовать каталог /app/src/main/jniLibs/armeabi
в armeabi-v7a
и запустить APK как на 32-битных, так и на 64-битных устройствах, если в вашем приложении нет других собственных библиотек (также известных как общие объекты). Но помните, что вы не можете опубликовать такое приложение в Play Store: Google теперь требует 64-битную сборку для всех приложений.
Я попробую это!
Наконец-то я решил проблему! После нескольких дней отчаяния я заработал, понизив Gradle с 7.1.2 до 3.2.0.
Журналы старой версии Gradle:
Невозможно удалить библиотеку ".....\app\build\intermediates\transforms\mergeJniLibs\debug\0\lib\armeabi\lib.so" из-за отсутствия инструмента для удаления для ABI "ARMEABI". Упаковка как есть.
И тогда все устройства, в том числе 64-битные, ковыряются в библиотеках "armeabi".
Установив android.defaultConfig.ndk { abiFilters 'armeabi' }
в app\build.gradle, он также работает с Gradle 7.
Сначала вы должны убедиться, что файлы .so действительно включены в APK. Возможно, инструменты сборки просто игнорируют их, поскольку поддержка armeabi давно устарела. Если ваше приложение содержит какие-либо файлы .so, созданные для armeabi-v7a или arm64-v8a, возможно, вам придется их удалить; в противном случае Android может запутаться в том, какие файлы .so использовать.