Gradle: cambia la meta de compilación de NDK independiente de la meta de creación de SDK

En el pasado utilicé eclipse para proyectos NDK, el archivo Android.mk era perfectamente adecuado para compilar el NDK con el nivel 9 de la API al tiempo que permitía que la aplicación (SDK) se compilara en el nivel 22 de API. Pero parece que esto no es posible cuando se usa el Experimental Gradle construir el sistema (2.5) con Android Studio 1.3 RC1.

¿Qué puedo hacer para compilar SOLAMENTE el NDK en API nivel 9?

Mi archivo típico de Android.mk tiene este aspecto:

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 

Mi nuevo archivo gradle se ve así:

 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' } 

Investigué la fuente de Gradle y parece que la meta de construcción de NDK es codificada como la compileSdkVersion. ¿Existe un método para evitar o alterar este comportamiento?

NdkCompile.groovy (crear archivo)

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

Sdk.groovy (el destino se obtiene de la 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 } 

Si está utilizando la versión 0.4 del plugin experimental. Puedes establecer

 android.ndk { platformVersion = "19" } 

Ok, este es un hack terrible, pero es muy fácil. Encuentre el NDK, debe estar en android-sdk / ndk-bundle. Vaya a la carpeta de plataformas. Cambia el nombre de android-21 a otra cosa. Hacer una copia de android-19, y luego copiar las tres carpetas de 64 bits de android-21 en él, a continuación, cambie el nombre de android-21. Gradle va a pensar que está usando android-21, y lo hará para los objetivos de 64 bits, pero para objetivos de 32 bits que utilizará android 19.

No estoy 100% seguro de que esto es seguro, pero lo probé en algunos dispositivos y ahora tengo una aplicación en la prueba Beta. Creo que es más limpio que hacer tareas de gradle para ndk-build. Siempre que Google corrija gradle experimental, nada necesita cambiar a no ser reinstalar el ndk.

 model { android { compileSdkVersion = 22 buildToolsVersion '20' defaultConfig.with { applicationId = "com.example" minSdkVersion.apiLevel = 9 targetSdkVersion.apiLevel = 22 versionCode = 1 versionName = "1.0" } } 
  • CompileKotlin bloquea en archivo build.gradle lanza error "No se pudo encontrar el método compileKotlin () para los argumentos "
  • Android Studio 3.0, compilación AAPT2 falló - dimen no válido en el archivo de recursos
  • Cómo comprobar cuál es la última versión de una dependencia para usar en gradle
  • ¿Cómo poner clases específicas en el archivo principal DEX?
  • Prueba de Android: 'Múltiples archivos dex' cuando se usa 'cheque de gradle chequeado'
  • Gradle - Android Studio crea aplicaciones multidex demasiado lentas
  • Tela Beta y separaciones de APK
  • Dependencia ignorada debido al conflicto Android studio
  • Gradle: error: escape ilegal de unicode
  • XmlPullParserException: vector de etiqueta desplegable no válido
  • Plugin experimental de Android Gradle de ejecución instantánea
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.