2015-07-14 9 views
6

In der Vergangenheit habe ich Eclipse für NDK-Projekte verwendet, die Datei Android.mk war perfekt zum Kompilieren des NDK mit API-Level 9 geeignet, während die App (SDK) kompiliert werden konnte API-Level 22. Es scheint jedoch, dass dies nicht möglich ist, wenn das experimentelle Gradle-Build-System (2.5) mit Android Studio 1.3 RC1 verwendet wird.Gradle: Ändern des NDK-Buildziels unabhängig vom SDK-Buildziel

Was kann ich tun, um NUR NDK auf API Level 9 zu kompilieren?

Meine typische Android.mk Datei sieht wie folgt aus:

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 

Meine neue gradle Datei sieht wie folgt aus:

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

ich die Gradle Quelle untersucht und es scheint, dass das NDK Ziel bauen ist hart codiert wie die compileSdkVersion. Gibt es eine Methode, um dieses Verhalten zu vermeiden oder zu ändern?

NdkCompile.groovy (Erstellung der Datei machen)

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

Sdk.groovy (Ziel geholt Form ist die 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 
} 

Antwort

3

Wenn Sie das experimentelle Plugin Version 0.4 verwenden. Sie können

setzen
android.ndk { 
    platformVersion = "19" 
} 
+0

Tatsächlich haben sie endlich dieses Update gemacht! –

-1
model { 
    android { 
     compileSdkVersion = 22 
     buildToolsVersion '20' 


     defaultConfig.with { 
      applicationId = "com.example" 
      minSdkVersion.apiLevel = 9 
      targetSdkVersion.apiLevel = 22 
      versionCode = 1 
      versionName = "1.0" 
     } 
    } 
+2

Wie beantwortet das meine Frage? –

+1

Sie müssen das greadle Build-System ändern, um es dort zu unterstützen. – NovusMobile

+2

Noch immer nicht klar, wie deine Antwort mir dabei helfen könnte. –

1

Ok, das ist eine schreckliche Hack, aber es ist sehr einfach. Finden Sie das NDK, sollte es in android-sdk/ndk-Bundle sein. Geh in den Plattformordner. Benennen Sie android-21 in etwas anderes um. Erstellen Sie eine Kopie von Android-19 und kopieren Sie dann die drei 64-Bit-Ordner von Android-21 hinein und benennen Sie sie anschließend in android-21 um. Gradle wird denken, dass es Android-21 verwendet, und es wird für 64-Bit-Ziele, aber für 32-Bit-Ziele wird es Android 19.

Ich bin nicht 100% sicher, dass dies sicher ist, aber ich habe es getestet ein paar Geräte und ich habe gerade eine App im Beta-Test. Ich denke, es ist sauberer als Großprojekte für ndk-build. Immer wenn Google das experimentelle Gridle korrigiert, muss nichts anders geändert werden, als das ndk neu zu installieren.

Verwandte Themen