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 определяет, какую библиотеку загружать, поэтому важно, чтобы вы ее не меняли.