Как использовать "armeabi" .so-файлы на других архитектурах?

Я создаю устаревшее приложение для 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.

Сначала вы должны убедиться, что файлы .so действительно включены в APK. Возможно, инструменты сборки просто игнорируют их, поскольку поддержка armeabi давно устарела. Если ваше приложение содержит какие-либо файлы .so, созданные для armeabi-v7a или arm64-v8a, возможно, вам придется их удалить; в противном случае Android может запутаться в том, какие файлы .so использовать.

Michael 17.03.2022 11:20

Большое спасибо за ваш ответ. Извлеченный APK включает файлы .so в каталоге armeabi. Это единственный каталог в папке lib. Если я переименую каталог в «ameabi-v7a», он будет работать на более старом устройстве. Но если я переименую его в «arm64-v8a», другое устройство будет думать, что библиотеки 64-битные, но они 32-битные. Моя проблема в том, что устройства не ищут каталог "armeabi".

Jan Knoblauch 17.03.2022 11:45
0
2
47
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

У вас должна быть возможность переименовать каталог /app/src/main/jniLibs/armeabi в armeabi-v7a и запустить APK как на 32-битных, так и на 64-битных устройствах, если в вашем приложении нет других собственных библиотек (также известных как общие объекты). Но помните, что вы не можете опубликовать такое приложение в Play Store: Google теперь требует 64-битную сборку для всех приложений.

Я попробую это!

Jan Knoblauch 17.03.2022 15:47
Ответ принят как подходящий

Наконец-то я решил проблему! После нескольких дней отчаяния я заработал, понизив 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.

Другие вопросы по теме

Похожие вопросы

Как включить автозапуск сразу после установки приложения из плеймаркета
Отображать мои изображения, хранящиеся в хранилище Firebase, ссылаясь на списки путей к изображениям в моей базе данных Firestore
Включить кнопку, если флажок установлен в Kotlin?
Внедрение зависимостей с помощью Hilt классов интерфейса с функциональными блоками приостановки
HMS: получение ошибки в токене push-уведомления с кодом ошибки 907135003
Жест React Native Expo Flatlist для обновления не срабатывает на iOS, но отлично работает на Android
Как я могу получить или создать свой идентификатор клиента на уровне приложения в Huawei для любого комплекта?
Программно загруженный файл не может быть открыт в Android. Его можно открыть после перезагрузки Android-устройства. В чем может быть проблема?
Почему setState не обновляет мой пользовательский интерфейс, даже если он изменяется?
Чтение определенного количества файлов из внешнего хранилища Android Studio