Почему добавление abiFilters заставляет приложение работать правильно? - PullRequest
0 голосов
/ 25 октября 2018

Я давно использовал в проекте нативную библиотеку, и все работало нормально.Сейчас я использую Android Studio 3.2.1 и Graddle 4.6

Как я уже говорил, все прошло хорошо в течение долгого времени.Теперь я сделал некоторые изменения и перестроил новый apk, и при запуске на System.loadLibrary("mylibrary") я получил эту ошибку:

java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[...]couldn't find "mylibrary.so"

В структуре моего проекта у меня есть jniLibs\armeabi\mylibrary.so.

Итак, я начал искать, что это UnsatisfiedLinkError и что может вызвать это из ниоткуда.

Решение, которое запустило apk как надо, было добавлено в мой файл gradle:

ndk{
  abiFilters "armeabi"
}

Я не понимаю, почему он работал в прошлом месяце, а теперь нет?Что-то изменилось в Graddle?Кроме того, кто-нибудь может объяснить, что именно делает abiFilters?В их документах написано Specifies the Application Binary Interfaces (ABI) that Gradle should build outputs for and package with your APK., но я вижу, что он существовал долгое время, и это не что-то новое.

Ответы [ 2 ]

0 голосов
/ 26 октября 2018

Я предполагаю, что вы НЕ используете по умолчанию версии инструментов сборки, например, NDK r18, для вашей Android Studio 3.2.1.Потому что armeabi был удален с NDK r17.

В структуре моего проекта у меня есть jniLibs \ armeabi \ mylibrary.so.

Попытайтесь рассмотреть возможность переноса вашего нативного кода в эти новые ABI.См .: https://developer.android.com/ndk/guides/abis


Ниже abiFilter заставит ваш APK пакет armeabi только , и этот ABI станет основным выбором ABI для всех ваших устройств,

ndk{
  abiFilters "armeabi"
}

Другими словами, независимо от того, является ли ваше устройство arm64-v8a или armeabi-v7a, менеджер APK будет выбирать нативные библиотеки из <your-apk-path>/lib/armeabi/....Итак, в Android Studio попробуйте « Build » -> « Analyze APK », чтобы подтвердить это предположение, изучив структуру каталогов APK.

0 голосов
/ 25 октября 2018

Ваш файл пропустил префикс 'lib', jniLibs\armeabi\mylibrary.so should be

jniLibs\armeabi\libmylibrary.so
...