2015-01-08 7 views
16

Ich definiere einige Variablen innerhalb der Android.mk Datei (ich übergebe einige Flags für den Compiler), aber jedes Mal, wenn ich mein Projekt erstelle, wird die Android.mk überschrieben. Ich gehe davon aus, dass Gradle dafür verantwortlich ist und dass ich dort suchen sollte? Wie verwende ich meine eigene Android.mk Datei?Wie benutze ich meine eigene Android.mk Datei mit Android Sudio

Hintergrund Info:

Ubuntu 64bit, Android Studio 1.0.1, JDK7. Ich habe meine NDK Version mit O-LLVM NDK gewickelt, und als solche bin der Bearbeitung der Android.mk Datei auf app/build/intermediates/ndk/debug befindet (es ist die einzige Android.mk Datei in meinem Projekt dir), anders als der Ort, der die doc für O-LLVM Beispiele gibt.

Auch gibt es keine Application.mk Datei, also nehme ich wieder an, dass Gradle für die Aufrufe an den Compiler verantwortlich ist?

Jede Hilfe würde sehr geschätzt werden.

Kyle


Aktuelle Informationen

build.gradle - (app)

//The following code until the "----" line is the new build.gradle config file 
// that disables automatic Android.mk file generation 

import org.apache.tools.ant.taskdefs.condition.Os 
apply plugin: 'com.android.application' 

android { 

    compileSdkVersion 21 
    buildToolsVersion "21.1.2" 

    defaultConfig { 
     applicationId "com.md.helloworld" 
     minSdkVersion 15 
     targetSdkVersion 21 
     versionCode 1 
     versionName "1.0" 
     ndk { 
      moduleName "MyLib" 
     } 
    } 

    buildTypes { 
     release { 
      minifyEnabled false 
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 
     } 
    } 

    sourceSets.main { 
     jniLibs.srcDir 'src/main/libs' //set libs as .so's location instead of jni 
     jni.srcDirs = [] //disable automatic ndk-build call with auto-generated Android.mk file 
    } 

    // Call regular ndk-build (.cmd) script from the app directory 
    task ndkBuild(type: Exec) { 
     commandLine 'ndk-build', '-C', file('src/main/').absolutePath 
    } 

    tasks.withType(JavaCompile) { 
     compileTask -> compileTask.dependsOn ndkBuild 
    } 
} 

dependencies { 
    compile fileTree(dir: 'libs', include: ['*.jar']) 
    compile 'com.android.support:appcompat-v7:21.0.3' 
} 

/* 
//The following code is the original Android.mk file 

apply plugin: 'com.android.application' 

android { 
    compileSdkVersion 21 
    buildToolsVersion "21.1.2" 

    defaultConfig { 
     applicationId "com.md.helloworld" 
     minSdkVersion 15 
     targetSdkVersion 21 
     versionCode 1 
     versionName "1.0" 
     //The only modified line 
     ndk { 
      moduleName "MyLib" 
     } 
    } 
    buildTypes { 
     release { 
      minifyEnabled false 
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 
     } 
    } 
} 

dependencies { 
    compile fileTree(dir: 'libs', include: ['*.jar']) 
    compile 'com.android.support:appcompat-v7:21.0.3' 
} 
*/ 

Android.mk

LOCAL_PATH := $(call my-dir) 

include $(CLEAR_VARS) 

LOCAL_MODULE := helloWorld 
LOCAL_SRC_FILES := main.c 

LOCAL_LDLIBS := -static 

include $(BUILD_EXECUTABLE) 

Application.mk

LOCAL_PATH := $(call my-dir) 

include $(CLEAR_VARS) 

APP_ABI := armeabi 

NDK_TOOLCHAIN_VERSION := clang3.4-obfuscator 

include $(BUILD_EXECUTABLE) 

Bitte beachten Sie: Ich bin vorbei keine cflags nur noch, ich Vanilla bauen zu bekommen versuchen Arbeits erste

Antwort

22

ja, Standardmäßig regeneriert das Android-Plugin und verwendet seine eigene Android.mk Datei, um Ihre Quellen zu kompilieren.

Sie können diese deaktivieren und Ihre eigene statt Android.mk-Datei verwenden, um diese in Ihrer build.gradle Konfigurationsdatei einstellen:

import org.apache.tools.ant.taskdefs.condition.Os 
...  
android { 
    ... 

    sourceSets.main { 
     jniLibs.srcDir 'src/main/libs' //set libs as .so's location instead of jniLibs 
     jni.srcDirs = [] //disable automatic ndk-build call with auto-generated Android.mk 
    } 

    // call regular ndk-build(.cmd) script from app directory 
    task ndkBuild(type: Exec) { 
     if (Os.isFamily(Os.FAMILY_WINDOWS)) { 
      commandLine 'ndk-build.cmd', '-C', file('src/main').absolutePath 
     } else { 
      commandLine 'ndk-build', '-C', file('src/main').absolutePath 
     } 
    } 

    tasks.withType(JavaCompile) { 
     compileTask -> compileTask.dependsOn ndkBuild 
    } 
} 

Beachten Sie, dass, wenn Sie brauchen nur Ihre eigenen passieren cflags zum automatisch generierten Makefile, können Sie diese innerhalb der cFlags "" Eigenschaft festlegen, innerhalb android { ndk {}}

+0

Dank ph0b. Das Problem, das ich jetzt habe, ist, dass der Aufruf von ndk-build in der Konfigurationsdatei build.gradle nicht kompiliert wird, also habe ich diese Zeile entfernt und die Abhängigkeit des Java-Compilers entfernt und ndk-build über die Befehlszeile ausgeführt. Dies baut die ndk-Strafe auf, allerdings habe ich die .so-Dateien nicht mehr erzeugt. Irgendwelche Hinweise oder Tipps? – KyleM

+1

Ich sehe nicht, warum es nicht kompilieren würde, vielleicht hast du die 'import.org.apache.tools.ant.taskdefs.condition.Os' vergessen? Die .so werden von ndk-build erzeugt, standardmäßig in libs/(armeabi | armeabi-v7a | x86 | mips | ...). Überprüfen Sie, ob der Pfad 'src/main/libs' korrekt ist und ob Ihre .so-Dateien vorhanden sind. – ph0b

+1

Hi ph0b, ich habe den Kompilierfehler behoben, ndk-build war nicht als Befehl verfügbar, also ist das sortiert. Das Problem, das ich jetzt habe, ist, dass die .so-Dateien nirgendwo erzeugt werden. Ich habe im gesamten Projektverzeichnis nach ihnen gesucht, aber seit dem Erstellen des Projekts mit der neuen Gradle-Datei kein Glück mehr. Das Projekt wird ordnungsgemäß erstellt. Wenn Sie jedoch versuchen, es auszuführen, gibt es einen UnatisfiedLinkError, da die Datei libMyLib.so nicht gefunden werden kann. Ich habe meine Frage mit meiner Datei "gadle.build" und sowohl der Datei "Android.mk" als auch der Datei "Application.mk" aktualisiert. Vielen Dank ph0b – KyleM

Verwandte Themen