2016-12-21 9 views
3

Я не новичок в разработке Android, но я полный новичок, когда говорю о библиотеках NDK и .so.Android: в том числе библиотеки ndk .so для разных архитектур, сбои приложений

Приложение, которое я создаю, использует сторонние SDK, и они предоставляют некоторые .so-файлы. Они предоставляют мне файл .so для каждой архитектуры (до сих пор: arm64-v8a, armeabi, armeabi-v7a, mips, mips64, x86, x86_64).

Мне нужно включить новый сторонний SDK, но они предоставляют только файлы .so для armeabi-v7a и x86. Когда я пытаюсь запустить мое приложение, он выходит из строя, и я получаю сообщение об ошибке из SDK (я вижу его на LogCat), который гласит:

SDKNAME в настоящее время только предоставляет скомпилированную библиотеку для armeabi-v7a и x86 архитектуры

Это распространенный сценарий? есть ли способ исправить этот сценарий?

спасибо заранее

+0

По моему вы могли бы только построить свой проект для архитектур armeabi-v7a или x86. Проверьте, какой вариант сборки вы используете, очень вероятно, что ни один из них не будет. – ortisenderos

+1

Я не использую ничего, определяющее архитектуры в моих конфигурациях сборки. Опять же, я супер n00b. Я нашел это: https://developer.android.com/studio/build/configure-apk-splits.html Как вы думаете, это может помочь? – aarcoraci

+0

Вы должны предоставить дополнительную информацию, например: используя Android Studio или Eclipse, файлы конфигурации ... – ortisenderos

ответ

1

Храните скомпилированные библиотеки в приложение/SRC/главная/jniLibs/{арочной}, например: armeabi/armeabi-v7a, а затем добавьте строки в конце поста на ваш apps build.gradle.

ПродуктFlavours используется для настройки вариантов компиляции, поэтому таким образом вы могли бы правильно связать уже скомпилированные библиотеки.

android.ndk { 
     moduleName = "your_library_jni" 
     cppFlags.add("-fexceptions") 
     cppFlags.add("-std=c++11") 
     cppFlags.add("-I" + file("src/main/jni").absolutePath) 
     } 

android.productFlavors { 
     create("x86") { 
      ndk.with{ 
       abiFilters.add("armeabi") 

       File curDir = file('./') 
       curDir = file(curDir.absolutePath) 
       String libsDir = curDir.absolutePath + "/src/main/jniLibs/armeabi/" 

       ldLibs.add(libsDir + "libyour_module.so") 

      } 
     } 
     create("arm-v7a") { 
      ndk.with { 
       abiFilters.add("armeabi-v7a") 

       File curDir = file('./') 
       curDir = file(curDir.absolutePath) 
       String libsDir = curDir.absolutePath + "/src/main/jniLibs/armeabi-v7a/" 

       ldLibs.add(libsDir + "libyour_module.so") 

      } 
     } 
    } 
3

Необходимо, чтобы все библиотеки были доступны для всех архитектур, поддерживаемых вашим приложением.

Когда APK установлен, установщик сканирует APK для тех архитектур, которые он поддерживает. Если APK не содержит собственный код, он поддерживает все архитектуры. Однако, если он содержит встроенный код, он поддерживает только те архитектуры, которые включены в APK. Большинство современных устройств поддерживают более одной архитектуры; например, устройство может поддерживать arm64-v8a и armeabi-v7a, или x86_64 и x86, или x86 и armeabi-v7a (посредством эмуляции). При установке он просматривает, какие архитектуры включены, выбирает наиболее предпочтительную архитектуру этих и устанавливает все библиотеки из этой архитектуры, игнорируя остальные. (Старые версии Android могут непреднамеренно продемонстрировать несколько иное, непоследовательное поведение в случаях, подобных описанным - см. https://stackoverflow.com/a/25648943/3115956.)

Теперь, если одна из библиотек, которые вы включаете, входит в сборку для всех доступных архитектур, в то время как другая поддерживает только несколько, установщик может выбрать, например, arm64-v8a, и, таким образом, не получить все необходимые библиотеки.

Таким образом, вы можете поддерживать только пересечение архитектур, предоставляемых всеми вашими библиотеками.

Для достижения этой цели, вы можете вручную удалить лишние каталоги из SDKs, которые обеспечивают больше архитектур, или при использовании Gradle построить свой APK, вы можете добавить это к блоку НКА:

abiFilters 'armeabi-v7a', 'x86'