2014-01-22 5 views
7

У нас есть это приложение, которое загружает собственную библиотеку, и эта библиотека предоставляет собственные методы для вызова. На некоторых телефонах (особенно медленнее ) это создает проблему. UnsatisfiedLinkError встречается всякий раз, когда (я думаю), библиотека все еще «загружена», а метод называется преждевременно.UnsatisfiedLinkError Android

Есть ли способ справиться с этой проблемой? Как проверить, загружена ли библиотека.

+0

Можете ли вы опубликовать код загрузки вашей родной библиотеки? Обычно я использую для этого статическую область. – mar3kk

+0

Библиотека загружается из файла .jar. Однако, чтобы указать на то, что библиотеки загружаются на некоторых телефонах очень хорошо и не вызывают указанной проблемы. Вот немного кода: Статический { System.loadLibrary ("libraryBeingLoaded"); } – hadez30

+1

Вы уверены, что ваши библиотеки скомпилированы для архитектуры. Вы работаете? Что делать, если он содержит только версию ARMEABI v7, а не ARMEABI? Чем он не будет работать на архитектуре ARMEABI. – mar3kk

ответ

3

Даже на более медленных устройствах вызов System.loadLibrary() происходит очень быстро; но если ваше приложение запускается многопоточно, или если класс, который включает статический конструктор, загружается только в ответ на какое-то событие UI, то может быть состояние гонки: некоторые другие классы, которые полагаются на собственную библиотеку, будут вызывать сбои.

Нет запрета на использование статического конструктора, который вызывает System.loadLibrary() для всех классов, имеющих собственные методы. Вы могли видеть некоторые предупреждения о загрузке загружаемой библиотеки, но это не имеет негативных последствий.

Иногда мы используем собственный Java-код для извлечения родных библиотек в каталог files, когда приложение запускается в первый раз, вместо того чтобы полагаться на системный установщик, который помещает их в каталог lib. Это должно быть сделано с особой осторожностью, и все действия (предназначенные для каламбур) должны подождать, пока не завершится извлечение libs (как правило, из папки активов APK).

Еще одним уловком может быть то, что для некоторых устройств имя вашей библиотеки может использоваться системной библиотекой. В таком случае System.loadLibrary() загрузит библиотеку с /system/lib, а не из вашего приложения; но это вряд ли объясняет эффект задержки 3 с.

+0

Да, возможно, состояние гонки. Тем не менее, странно, что один из встроенных методов не вызвал UnsatisfiedLinkError. И вызов другого родного метода, сразу после этого дает UnsatifiedLinkError. Что касается вашего третьего случая, тем не менее, похоже, что это не проблема, поскольку он выполняется, если есть какая-то задержка. Я думаю, что моя проблема должна сделать больше с первым случаем, о котором вы говорили. Однако я не уверен, как действовать дальше. Спасибо за ответ, пока. – hadez30

+0

_Новый метод native не вызывал UnsatisfiedLinkError.И вызов другого родного метода, сразу после этого дает UnsatifiedLinkError_, это действительно звучит inetersting. Предоставьте соответствующий фрагмент (отфильтрованный) 'logcat -v threadtime', который включает сообщение журнала непосредственно перед и сразу после вызова каждого из собственных методов. –

+0

Кажется, что проблема была (но все еще неподтвержденной), является вторым методом (который вызывает UnsatisfiedLinkErro) вызывается до 1-го. Это что-то похожее: ApiClass.Start() - это, предположим, начало api ApiClass.DoSomething(). Я думаю, что ApiClass.DoSomething() был вызван первым. – hadez30

Смежные вопросы