Вызвано: java.lang.UnsatisfiedLinkError: невозможно загрузить библиотеку

Я пишу игру, и у меня огромная собственная библиотека, я пытаюсь загрузить свою родную библиотеку в свою основную деятельность, например

static { try { System.loadLibrary("mylib"); } catch (UnsatisfiedLinkError e) { Log.d(TAG, "Unsatisfied Link error: " + e.toString()); } } 

Я тестировал этот код на многих устройствах в доме, я не получаю эту ошибку. Но из моего опубликованного я делаю журналы с « Caused by: java.lang.UnsatisfiedLinkError: невозможно загрузить библиотеку ». ПРИМЕЧАНИЕ. Этот сбой не является универсальным, лишь немногие люди получают этот крах

  • Это проблема, когда библиотека помещается в экспортированный apk? Теперь у меня есть библиотека, помещенная в /libs/armabi/libmylib.so автоматически через eclipse?
  • Это что-то связано с версией Android? Я поддерживаю версии Android начиная с версии 2.3 (уровень API 9)
  • Или мне нужно загрузить библиотеку из другого места?
  • Или я пропускаю что-то очень важное
  • Это проблема с установкой всего приложения на SDCARD?

Дополнительная информация о сбое: load_segments: 68 не удалось отобразить сегмент из mylib.so

Solutions Collecting From Web of "Вызвано: java.lang.UnsatisfiedLinkError: невозможно загрузить библиотеку"

Учитывая, что ваше приложение работает правильно на большинстве устройств и только иногда дает вам ошибку, можно с уверенностью предположить, что библиотека правильно упакована в APK и что ее размер / размер памяти также приемлемы.

Таким образом, я пойду по прихоти и предположим, что проблема связана с архитектурой сборки / компиляции библиотеки. Большинство новейших устройств Android используют процессор ARM7. Весьма вероятно, что ваша библиотека также скомпилирована с архитектурой ARM7. Некоторые более старые устройства, особенно те, на которых работает Android 2.3, используют ARM6-процессор (у меня есть одно такое устройство, которое я использую для тестирования – LG GT540 под управлением Android 2.3.3), который не поддерживает переходы с архитектурой ARM7. Я видел ошибку с ошибкой, подобной той, которую вы указали ( load_segments: 68 не удалось отобразить сегмент из mylib.so ), когда я попытался запустить приложение, предназначенное для ARM7 на моем старом телефоне ARM6.

Существует три способа обойти эту проблему:

  1. Скомпилируйте библиотеку с обеих архитектур и включите в apk два отдельных файла .so. Затем во время выполнения определите тип процессора и загрузите правильный. Честно говоря, я не знаю, возможно ли это.

  2. Создайте два отдельных файла apk – один для ARM6 и один для ARM7 – затем используйте фильтры в манифесте, чтобы указать соответствующую архитектуру. Вы можете загрузить оба из них в Google Play для одного и того же приложения – и фильтры в манифесте будут контролировать, какой из них загружен на какое-либо устройство.

  3. Поддерживайте архитектуру ARM7, указав требования устройства в манифесте. Вы потеряете некоторую аудиторию клиентов, но у вас будет меньше работы для поддержания двух версий приложения.

EDIT: согласно документации NDK, он может создавать несколько библиотек для разных архитектур за один раз. Вы можете контролировать, какие именно процессоры вы хотите настроить, добавив следующую строку в файл Application.mk :

 APP_ABI := arch1 arch2 arch3 ... 

например,

 APP_ABI := armeabi armeabi-v7a mips 

Затем процесс сборки будет создавать разные версии родной библиотеки. Эти версии должны быть помещены в окончательный apk в каталог

 lib/<abi>/lib<name>.so 

Где имя архитектуры. Затем вы загрузите библиотеку

 System.loadLibrary("<name>"); 

Кроме того, вы можете создавать отдельные файлы apk для каждой архитектуры, а затем использовать функции multi-apk в google play.

Вы можете найти всю информацию о таргетинге архитектуры в файле CPU-ARCH-ABIS.html в поддиректории docs NDK.