Почему я получаю отчеты об ошибке java.lang.UnsatisfiedLinkError из Market

У меня есть приложение на рынке Android, и в его отчетах о сбоях я получаю сбои java.lang.UnsatisfiedLinkError и каждый раз для разных файлов .so.

ошибки выглядят так

java.lang.ExceptionInInitializerError
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.UnsatisfiedLinkError: Couldn't load *****: findLibrary returned null

or

java.lang.ExceptionInInitializerError
at java.lang.Thread.run(Thread.java:1019)
Caused by: java.lang.UnsatisfiedLinkError: Cannot load library: alloc_mem_region[871]: OOPS: 116 cannot map library ********. no vspace available.

or

java.lang.UnsatisfiedLinkError: Couldn't load ******: findLibrary returned null
at java.lang.Runtime.loadLibrary(Runtime.java:429)
at java.lang.System.loadLibrary(System.java:554)

Похоже, что некоторые устройства не могут найти некоторые файлы .so. Сбой не связан с каким-либо конкретным файлом .so. У меня есть около 4 файлов .so в моем приложении, и иногда он падает для 1, а иногда для другого.

Я никогда не мог воспроизвести эту проблему во время тестирования, хотя я тестировал почти все версии Android...

Любые указатели будут высоко оценены

Спасибо


person Naveen    schedule 15.12.2011    source источник
comment
Думаю, это поможет, если вы покажете, как вы связываете это.   -  person Warpzit    schedule 15.12.2011
comment
Просто System.loadLibrary(mylibrary). Как я уже упоминал, в большинстве устройств проблем нет... но все же я получаю некоторые отчеты с рынка...   -  person Naveen    schedule 15.12.2011
comment
Я еще не смог разобраться с этой проблемой, но получил дополнительную информацию о том, что перемещение приложения на SD-карту решает проблему на некоторых устройствах... устройства, которые я нашел, в основном это устройства HTC, такие как HTC Wildfire S... Любые указатели?   -  person Naveen    schedule 15.05.2012


Ответы (4)


Я сам сталкивался с подобными проблемами — похоже, это затрагивает очень небольшое количество пользователей, и я не могу напрямую соотнести это с типами устройств или операционными системами. Однако из проведенного мной исследования я нашел обсуждение на Кодовая страница Cyanogenmod Google; Подводя итог: похоже, что некоторые сборки этого мода не точно скопировали некоторые изменения, внесенные Google в библиотеки системного уровня, а это означает, что некоторые символы (например, __android_log_print) могут вызывать ошибки, в том числе заставлять вашу библиотеку не загружаться.

Я пытаюсь выяснить это дальше, но я решил поделиться тем, что у меня есть на сегодняшний день.

person Sydin    schedule 20.10.2012

Знаете ли вы телефоны и / или версии Android, которые вызывают эту проблему?

Каков размер библиотек? Может быть, при загрузке библиотек вы достигаете предела памяти старых телефонов?

person micha    schedule 26.12.2011
comment
Это может быть одной из причин... Как я уже сказал, я не смог воспроизвести ни на одном из имеющихся у меня устройств, а в журналах рынка Android нет информации об устройстве... - person Naveen; 26.12.2011

Возможно, вы выделяете слишком много памяти в libxxxx.so.

«Вызвано: java.lang.UnsatisfiedLinkError: невозможно загрузить библиотеку: alloc_mem_region[871]: OOPS: 116 не удается сопоставить библиотеку **. vspace недоступен».

person yingxiaosan    schedule 16.01.2013

Я получал отчеты из Маркета о UnsatisfiedLinkError, хотя мое приложение отлично работало в эмуляторе и на нескольких устройствах Android, которые у меня есть для тестирования. В какой-то момент я открыл сгенерированный архив .apk и заметил, что в нескольких папках libs/<ABI> отсутствует одна из связанных библиотек, которые я использую (файл .so). Оказалось, что устройства Android с процессорами, поддерживающими arm64, будут загружать некоторые из связанных библиотек и аварийно завершать работу, когда они не смогут найти версию arm64 одной из библиотек, которые использует мое приложение (вместо того, чтобы вернуться к arm7v).

Аналогичная проблема с более подробной информацией объясняется здесь: https://realm.io/docs/java/latest/#couldnt-load-librealm-jniso

Короче говоря, я добавил дополнительную конфигурацию в свой build.gradle, исключающую arm64:

android {
  ndk {
    abiFilters "armeabi", "armeabi-v7a", "x86"
  }
}

В качестве примечания: процессоры arm64-v8a совместимы с набором инструкций arm-v7a и могут выполнять 32-битные инструкции Thumb, но смешивание 64- и 32-битных библиотек не допускается.

person Lachezar    schedule 25.11.2015