2015-12-17 2 views
2

Я хочу сделать что-то концептуально простое, но для которого я не могу найти никакой документации. У меня есть определенные библиотеки, для которых я скомпилировал файлы SO для всех интересующих меня платформ.Обтекание родных библиотек (файлов SO) в архив Android (файл aar)

Теперь я хотел бы просто создать файл AAR, содержащий эти файлы.

Я знаю, что файл AAR должен иметь структуру, как: /jni//mylib.so

Что я теперь знаю, какой тип Manifest/другие метаданные я должен производить.

В идеале было бы здорово сгенерировать это с помощью Gradle, но мне просто нужно, чтобы это было сделано, поэтому имеет смысл также писать простой скрипт, создающий zip, а затем переименовать его.

+0

Обычно Android Studio будет создавать файлы AAR для вас. Вы просто убедитесь, что библиотеки находятся в каталоге jniSrc. Последний экспериментальный плагин добавляет [чистые собственные зависимости] (http://tools.android.com/tech-docs/new-build-system/gradle-experimental#TOC-NDK-Dependencies) –

+1

Возможный дубликат [Как упаковать .so файлы в мой архив .aar?] (http://stackoverflow.com/questions/29803921/how-do-i-package-so-files-into-my-aar-archive) – skywinder

ответ

4

Публикация AAR с родными библиотеками довольно проста. Преимущества, которые я нашел, включают:

  • При использовании нескольких проектов, конечно же, есть преимущество в не дублируя родной код
  • сборки приложения гораздо быстрее, так как вы не должны делать компиляцию NDK в приложении. Так что если собственный код изменяется реже
  • В моем случае была несовместимость с некоторыми комбинациями NDK и SDK. Возможность создавать библиотеку с более старым SDK и приложение с более новой версией работает очень хорошо. (избегает того, что мое приложение застряло на старой версии SDK из-за проблемы с NDK)
  • может иметь модульные тесты против кода библиотеки, которые полностью независимы от любого приложения. (Тесты прикладного блока также могут протестировать библиотеку также)

Отказ в том, что есть несколько дополнительных шагов для обновления c-кода, но если это изменяется менее часто, чем приложение, то это хороший компромисс ,

Стоит отметить, что я получаю предупреждение: Current NDK support is deprecated. Alternative will be provided in the future. на каждой сборке. AFAIK, альтернатива пока недоступна - мое определение устаревших было бы тем, что оно не устарело до тех пор, пока это не произойдет.

Вот ключевые моменты, как у меня он работает:

  • с и код каст живет в SRC/главная/JNI
  • приложение/build.gradle (много это также относится к с использованием NDK в проекте приложения):

    • apply plugin: 'maven' на вершине под apply plugin: 'com.android.library'
    • Добавить заголовок с/CPP, содержащий каталоги ˙U NDER андроид блок:

      sourceSets.main { 
          jni.srcDirs 'src/main/jni/Thirdparty/lib1/headers', ... 
      } 
      
    • под Android/defaultConfig (независимо от опции ваш нативный код может понадобиться):

      ndk { 
           moduleName "module_name" 
           cFlags "-std=gnu++11 -D_LARGEFILE64_SOURCE -D_LARGEFILE_SOURCE -D__STDC_LIMIT_MACROS -fexceptions" 
           ldLibs "log" 
           stl "gnustl_static" 
          } 
      
    • Вне андроида блока - рассказать Gradle как опубликовать библиотеку к maven repo.Это просто выталкивает в каталог локального Android SDK репо, но это также возможно толкнули общие хранилища (я в настоящее время толкая к внутренней связующей репо также - Gradle код, который не включен)

      uploadArchives { 
          repositories { 
          mavenDeployer { 
          repository(url: "file://localhost" + System.getenv("ANDROID_HOME") + "/extras/android/m2repository/") 
          pom.version = '1.0-SNAPSHOT' 
          } 
          pom.groupId = 'com.example.groupid' 
          pom.artifactId = 'library_name' 
      } 
      
  • ./gradlew uploadArchives затем публикует действующий AAR моего местному репо, и я могу зависеть от него из проекта приложения, используя с compile 'com.example.groupid:library_name:1.0-SNAPSHOT' в приложении/build.gradle под Android/зависимости блок
  • под одеялом, Android SDK сливается ААР в APK приложения как если бы они были созданы как часть проекта приложения (включая несколько файлов jni/*/module_name.so)
+3

могут быть заголовки из папки jni также быть упакованными в aar? – igagis

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

  • Нет связанных вопросов^_^