2015-01-08 13 views
16

Sto definendo alcune variabili all'interno del file Android.mk (sto passando alcune bandiere per il compilatore), ma ogni volta che costruisco il mio progetto, lo Android.mk viene sovrascritto. Suppongo che Gradle sia responsabile e che dovrei guardare lì? Come utilizzare il mio file Android.mk?Come utilizzare il mio file Android.mk con Android Sudio

Informazione:

Ubuntu 64bit, Android Studio 1.0.1, JDK7. ho avvolto la mia versione NDK con O-LLVM NDK, e come tali sono la modifica del file Android.mk situato a app/build/intermediates/ndk/debug (è l'unico file Android.mk all'interno del mio progetto dir), diverso alla posizione che la doc per O-LLVM fornisce esempi di.

Inoltre, non c'è il file Application.mk, quindi, di nuovo, suppongo che Gradle sia responsabile delle chiamate al compilatore?

Qualsiasi aiuto sarebbe molto apprezzato.

Kyle


Informazioni aggiornate

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) 

Si prega di notare: non sto passando nessun cflags appena ancora, sto cercando di ottenere un Vanilla costruire lavorando prima

risposta

22

sì, per impostazione predefinita il plugin gradle per Android rigenera e utilizza il proprio file Android.mk per compilare i sorgenti.

È possibile disattivare questo e utilizzare il proprio file di Android.mk invece, impostando questo all'interno del vostro build.gradle file di configurazione:

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

Nota che se avete solo bisogno di passare il proprio cflags al Makefile generato automaticamente, è possibile impostare questi all'interno della proprietà cFlags "" per impostare all'interno android { ndk {}}

+0

Grazie ph0b. Il problema che sto avendo ora è che la chiamata a ndk-build all'interno del file di configurazione build.gradle non viene compilata, quindi ho rimosso quella riga e rimosso la dipendenza del compilatore Java ed eseguito ndk-build dalla riga di comando. Questo costruisce la multa ndk, tuttavia non ho più i file .so generati. Eventuali puntatori o suggerimenti? – KyleM

+1

Non vedo perché non si compili, forse hai dimenticato l'importazione di org.apache.tools.ant.taskdefs.condition.Os'? i file .so sono generati da ndk-build, di default all'interno di libs/(armeabi | armeabi-v7a | x86 | mips | ...). controlla che il percorso 'src/main/libs' sia corretto e che i tuoi file .so siano lì. – ph0b

+1

Ciao ph0b, ho riparato l'errore di compilazione, ndk-build non era disponibile come comando, quindi è ordinato. Il problema che sto avendo ora è che i file .so non vengono generati da nessuna parte. Li ho cercati all'interno dell'intera directory del progetto, ma senza fortuna da quando ho costruito il progetto con il nuovo file gradle. Il progetto si sviluppa bene, ma quando si tenta di eseguire, c'è un UnsatisfiedLinkError in quanto non riesce a trovare il file libMyLib.so. Ho aggiornato la mia domanda con il mio file gradle.build e sia il file Android.mk che il file Application.mk. Molte grazie ph0b – KyleM

Problemi correlati