Gradle: изменить цель построения NDK независимо от цели сборки SDK

Раньше я использовал eclipse для проектов NDK, файл Android.mk был отлично подходит для компиляции NDK с уровнем API 9, позволяя компиляции приложения (SDK) на уровне API 22. Но кажется, что это невозможно при использовании Экспериментальная система сборки Gradle (2.5) с Android Studio 1.3 RC1.

Что я могу сделать для компиляции только NDK на уровне API 9?

Мой типичный файл Android.mk выглядит так:

APP_PLATFORM := android-9 APP_STL := stlport_static APP_ABI := all # Enable c++11 extentions in source code APP_CPPFLAGS += -std=c++11 #Enable optimalization in release mode APP_OPTIM := release 

Мой новый файл gradle выглядит следующим образом:

 apply plugin: 'com.android.model.application' model { android { compileSdkVersion = 22 buildToolsVersion = "23.0.0 rc3" defaultConfig.with { applicationId = "com.example" minSdkVersion.apiLevel = 9 targetSdkVersion.apiLevel = 22 versionCode = 1 versionName = "1.0" } } android.ndk { moduleName = "NativeLibrary" cppFlags += "-I${file("src/main/jni/some_folder")}".toString() cppFlags += "-std=c++11" //What should be added here to compile the NDK on API 9??? CFlags += "-DNDEBUG" CFlags += "-fvisibility=hidden" cppFlags += "-fvisibility=hidden" ldLibs += ["log"] stl = "stlport_static" } android.buildTypes { release { isMinifyEnabled = true proguardFiles += file('D:/path/proguard-rules.pro') } } } dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) compile 'com.android.support:support-v4:22.2.0' } 

Я исследовал источник Gradle, и кажется, что цель сборки NDK жестко запрограммирована так же, как и compileSdkVersion. Есть ли способ избежать или изменить это поведение?

NdkCompile.groovy (создание файла создания)

 // target IAndroidTarget target = getPlugin().loadedSdkParser.target if (!target.isPlatform()) { target = target.parent } commands.add("APP_PLATFORM=" + target.hashString()) 

Sdk.groovy (цель извлекается из compileSdkVersion)

 public SdkParser loadParser() { checkNotNull(extension, "Extension has not been set") // call getParser to ensure it's created. SdkParser theParser = getParser() if (!isSdkParserInitialized) { String target = extension.getCompileSdkVersion() if (target == null) { throw new IllegalArgumentException("android.compileSdkVersion is missing!") } FullRevision buildToolsRevision = extension.buildToolsRevision if (buildToolsRevision == null) { throw new IllegalArgumentException("android.buildToolsVersion is missing!") } theParser.initParser(target, buildToolsRevision, logger) isSdkParserInitialized = true } return theParser } 

Если вы используете экспериментальный плагин версии 0.4. Вы можете установить

 android.ndk { platformVersion = "19" } 

Хорошо, это ужасный взлом, но это очень легко. Найдите NDK, он должен быть в android-sdk / ndk-bundle. Перейдите в папку платформ. Переименуйте Android-21 на что-то еще. Сделайте копию android-19, а затем скопируйте три 64-битных папки из android-21 в него, а затем переименуйте его android-21. Gradle ДУМАЕТ, что он использует android-21, и он будет для 64-битных целей, но для 32-битных целей он будет использовать android 19.

Я не уверен на 100%, что это безопасно, но я тестировал его на нескольких устройствах, и сейчас у меня есть приложение в Beta Test. Я думаю, что это чище, чем делать задачи градиента для ndk-build. Всякий раз, когда Google исправляет экспериментальную граду, ничего не нужно менять, кроме как переустановить ndk.

 model { android { compileSdkVersion = 22 buildToolsVersion '20' defaultConfig.with { applicationId = "com.example" minSdkVersion.apiLevel = 9 targetSdkVersion.apiLevel = 22 versionCode = 1 versionName = "1.0" } }