Папка armeabi и armeabi-v7a

Я работаю над проектом Android и использую NDK для вызова нативных методов. У меня есть две библиотеки (файлы.so), и одна находится в libs/armeabi папка, а другая находится в libs/armeabi-v7a папка lib.

Если я попытаюсь запустить приложение, оно не загрузит библиотеку в /libs/armeabi папка. Если я переместить файл библиотеки в libs/armeabi-v7a папку, затем она загружает библиотеку, но через 5-10 минут она вылетает и выдает ошибку ошибки сегментации.

Мне было интересно, если местоположение библиотеки (другой папки) может вызвать эту проблему.

3 ответа

Решение

Я сам новичок в этом, но иду по тому же пути... насколько я знаю, можно иметь только одну общую библиотеку; использовать несколько библиотек, сделать их статичными и связать их вместе в одну общую. Конечно, это предполагает, что вы сами создаете библиотеки;-)

При установке приложения служба менеджера пакетов будет сканировать.apk и искать любую общую библиотеку в форме:

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

Если он найден, он копируется в $APPDIR/lib/lib.so, где $ APPDIR соответствует каталогу данных конкретного приложения.

Если ничего не найдено, а вторичный ABI определен, служба будет искать общие библиотеки в форме:

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

Если что-либо найдено, оно копируется в $APPDIR/lib/lib.so.

Для первичного / вторичного аби,

Система Android знает во время выполнения, какие ABI она поддерживает. Точнее, до двух специфичных для сборки системных свойств используются для указания:

  • "основной" ABI для устройства, соответствующий машинному коду, используемому в самом образе системы.

  • необязательный "вторичный" ABI, соответствующий другому ABI, который также поддерживается системным образом.

Например, типичное устройство на основе ARMv5TE будет определять только первичный ABI как "armeabi", а не определять вторичный.

С другой стороны, типичное устройство на основе ARMv7 будет определять основной ABI для "armeabi-v7a" и вторичный для "armeabi", поскольку оно может запускать собственные двоичные файлы приложения, сгенерированные для них обоих.

Этот механизм гарантирует, что лучший машинный код для целевого устройства автоматически извлекается из пакета во время установки.

Загрузчик библиотеки попытается найти библиотеки, которые наиболее точно соответствуют архитектуре, на которой вы работаете. В общем, вы должны скомпилировать одну версию библиотеки для каждого abis, который вы планируете поддерживать (armeabi, armeabi-v7a, x86, mips), чтобы компилятор мог правильно оптимизировать.

Структура каталогов - это то, как Android определяет, какую библиотеку загружать, поэтому важно, чтобы вы ее не меняли.

Другие вопросы по тегам