Je définis certaines variables dans le Android.mk
fichier (je passe quelques drapeaux pour le compilateur), mais chaque fois que je construis mon projet, le Android.mk
est écrasé. Je suppose que Gradle
est responsable et que je devrais y chercher? Comment utiliser mon propre fichier Android.mk?
Informations générales:
Ubuntu
64 bits, Android Studio
1.0.1, JDK7. J'ai enveloppé ma version NDK
avec O-LLVM NDK , et en tant que tel, je modifie le Android.mk
fichier situé à app/build/intermediates/ndk/debug
(c'est le seul Android.mk
dans mon dossier de projet), différent de l'emplacement où le doc pour O-LLVM
donne des exemples de.
De plus, il n'y a pas de Application.mk
fichier, donc encore une fois, je suppose que Gradle
est responsable des appels au compilateur?
Toute aide serait grandement appréciée.
Kyle
Informations mises à jour
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)
Veuillez noter: je ne passe pas de cflags pour l'instant, j'essaie de faire fonctionner une version Vanilla en premier
oui, par défaut le plugin gradle Android régénère et utilise son propre fichier Android.mk pour compiler vos sources.
Vous pouvez le désactiver et utiliser votre propre fichier Android.mk à la place, en le définissant dans votre fichier de configuration build.gradle:
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
}
}
Notez que si vous avez seulement besoin de passer vos propres cflags au Makefile généré automatiquement, vous pouvez les définir dans le cFlags ""
propriété à définir à l'intérieur Android { ndk {}}