2015-09-19 3 views
1

Я пытаюсь использовать Android Studio для создания приложения с помощью NDK.Android Studio/gradle не для создания общей библиотеки для x86_64

Это связано с созданием файла .so, который затем использует мое приложение Java с System.loadLibrary.

К сожалению, файл .so только построен на ARM или x86, но Gradle не строит его для x86_64 abiFilter.

Мои build.gradle (я использую experimental Gradle plugin для Android Studio, чтобы получить поддержку NDK), с несвязанные детали раздели (productFlavors не имеет никаких деталей зачищенные):

apply plugin: 'com.android.model.application' 

model { 
    android { 

     compileSdkVersion = 19 
     buildToolsVersion = "23" 

     defaultConfig.with { 
      applicationId = "com.example" 
      minSdkVersion.apiLevel = 14 
      targetSdkVersion.apiLevel = 19 
     } 
    } 

    android.ndk { 
     moduleName = "JNIProcessor" 
    } 

    android.productFlavors { 

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

     create("x86") { 
      ndk.with { 
       abiFilters += "x86" 
      } 
     } 

     create("x86-64") { 
      ndk.with { 
       abiFilters += "x86_64" 
      } 
     } 
    } 
} 

Теперь, если я бегу ./gradlew installx86Debug --info, я получить на выходе (отформатированные на несколько строк для удобства чтения):

Selected primary task 'installX86Debug' from project : 
file or directory '/home/niklas/AndroidStudioProjects/androidcl/app/build/intermediates/pre-dexed/x86/debug', not found 
Tasks to be executed: [ 
    task ':app:preBuild', 
    task ':app:preX86DebugBuild', 
    task ':app:checkX86DebugManifest', 
    task ':app:prepareX86DebugDependencies', 
    task ':app:compileX86DebugAidl', 
    task ':app:compileX86DebugRenderscript', 
    task ':app:generateX86DebugBuildConfig', 
    task ':app:generateX86DebugAssets', 
    task ':app:mergeX86DebugAssets', 
    task ':app:generateX86DebugResValues', 
    task ':app:generateX86DebugResources', 
    task ':app:mergeX86DebugResources', 
    task ':app:processX86DebugManifest', 
    task ':app:processX86DebugResources', 
    task ':app:generateX86DebugSources', 
    task ':app:processX86DebugJavaRes', 
    task ':app:compileX86DebugJavaWithJavac', 
    task ':app:copyX86DebugX86JNIProcessorSharedLibraryGdbServer', 
    task ':app:createX86DebugX86JNIProcessorSharedLibraryGdbsetup', 
    task ':app:compileX86DebugX86JNIProcessorSharedLibraryJNIProcessorMainCpp', 
    task ':app:linkX86DebugX86JNIProcessorSharedLibrary', 
    task ':app:stripSymbolsX86DebugX86JNIProcessorSharedLibrary', 
    task ':app:x86DebugX86JNIProcessorSharedLibrary', 
    task ':app:compileX86DebugSources', 
    task ':app:preDexX86Debug', 
    task ':app:dexX86Debug', 
    task ':app:validateDebugSigning', 
    task ':app:packageX86Debug', 
    task ':app:zipalignX86Debug', 
    task ':app:assembleX86Debug', 
    task ':app:installX86Debug' 
] 

Если же я построить 64 бит с ./gradlew installx86-64Debug --info, вывод содержит только (все gradlew НУ tput линии до них одинаковы для двух сборок):

Selected primary task 'installX86-64Debug' from project : 
Tasks to be executed: [ 
    task ':app:preBuild', 
    task ':app:preX86-64DebugBuild', 
    task ':app:checkX86-64DebugManifest', 
    task ':app:prepareX86-64DebugDependencies', 
    task ':app:compileX86-64DebugAidl', 
    task ':app:compileX86-64DebugRenderscript', 
    task ':app:generateX86-64DebugBuildConfig', 
    task ':app:generateX86-64DebugAssets', 
    task ':app:mergeX86-64DebugAssets', 
    task ':app:generateX86-64DebugResValues', 
    task ':app:generateX86-64DebugResources', 
    task ':app:mergeX86-64DebugResources', 
    task ':app:processX86-64DebugManifest', 
    task ':app:processX86-64DebugResources', 
    task ':app:generateX86-64DebugSources', 
    task ':app:processX86-64DebugJavaRes', 
    task ':app:compileX86-64DebugJavaWithJavac', 
    task ':app:compileX86-64DebugSources', 
    task ':app:preDexX86-64Debug', 
    task ':app:dexX86-64Debug', 
    task ':app:validateDebugSigning', 
    task ':app:packageX86-64Debug', 
    task ':app:zipalignX86-64Debug', 
    task ':app:assembleX86-64Debug', 
    task ':app:installX86-64Debug' 
] 

Таким образом, эти записи не хватает для 64 битной сборки:

task ':app:copyX86DebugX86JNIProcessorSharedLibraryGdbServer', 
    task ':app:createX86DebugX86JNIProcessorSharedLibraryGdbsetup', 
    task ':app:compileX86DebugX86JNIProcessorSharedLibraryJNIProcessorMainCpp', 
    task ':app:linkX86DebugX86JNIProcessorSharedLibrary', 
    task ':app:stripSymbolsX86DebugX86JNIProcessorSharedLibrary', 
    task ':app:x86DebugX86JNIProcessorSharedLibrary', 

, что делает понятным, почему мои файлы .so отсутствует (например, Задача link нет).

Почему град решил не добавлять ссылку для моего x86_64 abiFilter?

+0

Я могу получить недостающие цели, установив 'compileSdkVersion = 23' и' targetSdkVersion.apiLevel = 23' вместо 19. Но я до сих пор не понимаю, почему. – nh2

+0

может быть из-за поддержки платформы x64, был введен с API 21: https://developer.android.com/ndk/guides/x86-64.html#comp –

+0

@ V-master Я думаю, что вы правы. Я бы ожидал «громкого сбоя» вместо «молча отбросить некоторые цели сборки» (например, «ссылка»), но если вы опубликуете это как ответ, я его приму. – nh2

ответ

0

Решено, установив «platformVersion» внутри тега NDK до 23 (вероятно, должно быть только 21 или выше). Таким образом, НЕ значения minSdkVersion и targetSdkVersion, которые предназначены для части Java, но значение platformVersion для части NDK.

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