Armeabi и armeabi-v7a
Я работаю над проектом Android, и я использую NDK для вызова собственных методов.
У меня есть две библиотеки (.so файлы), а одна находится в папке libs/armeabi
, а другая - в папке libs/armeabi-v7a
lib.
Если я попытаюсь запустить приложение, он не будет загружать библиотеку в папку /libs/armeabi
. Если я переведу библиотечный файл в папку libs/armeabi-v7a
, он загрузит библиотеку, но через 5-10 минут он выйдет из строя и выдаст ошибку ошибки сегментации.
Мне было интересно, может ли возникнуть проблема с расположением библиотеки (другой папки).
Ответы
Ответ 1
Я новичок в этом сам, но иду по тому же пути... насколько мне известно, может быть только одна общая библиотека; использовать несколько библиотек, сделать их статичными и связать их вместе с одним общим. Конечно, это предполагает, что вы сами создаете библиотеки; -)
Ответ 2
При установке приложения служба диспетчера пакетов сканирует .apk и ищет любую общую библиотеку формы:
lib/<primary-abi>/lib<name>.so
Если он найден, он копируется под $APPDIR/lib/lib.so, где $APPDIR соответствует каталогу данных конкретного приложения.
Если ни один не найден, а вторичный ABI определен, служба затем сканирует общие библиотеки формы:
lib/<secondary-abi>/lib<name>.so
Если что-то найдено, оно копируется в $APPDIR/lib/lib.so.
Для первичного/вторичного abi,
Система Android знает во время выполнения, которую поддерживает ABI (ы). Точнее, для обозначения:
используются до двух свойств системы,
-
"первичный" ABI для устройства, соответствующий коду машины, используемому в самом изображении системы.
-
необязательный "вторичный" ABI, соответствующий другому ABI, который также поддерживается системным изображением.
Например, типичное устройство на основе ARMv5TE будет определять первичный ABI как "armeabi" и не определять вторичный.
С другой стороны, типичное устройство на основе ARMv7 будет определять первичный ABI для "armeabi-v7a", а второй - "armeabi", поскольку он может запускать собственные двоичные файлы приложений, сгенерированные для них обоих.
Этот механизм гарантирует, что наилучший машинный код для целевого устройства автоматически извлекается из пакета во время установки.
Ответ 3
Загрузитель библиотеки попытается найти библиотеки, которые наиболее точно соответствуют архитектуре, в которой вы работаете. В общем, вы должны скомпилировать одну версию библиотеки для каждой из abis, которую вы планируете поддерживать (armeabi, armeabi-v7a, x86, mips), чтобы компилятор мог правильно оптимизировать.
Структура каталогов - это то, как Android определяет, какую библиотеку загружать, поэтому важно, чтобы вы ее не меняли.