gradle android-ndk android-studio jni java-native-interface llvm

gradle - Cómo usar mi propio archivo Android.mk con Android Sudio



android-ndk android-studio (1)

Estoy definiendo algunas variables dentro del archivo Android.mk (estoy pasando algunos indicadores para el compilador), pero cada vez que construyo mi proyecto, se sobrescribe Android.mk . ¿ Gradle que Gradle es responsable y que debería estar buscando allí? ¿Cómo uso mi propio archivo Android.mk?

Información de fondo:

Ubuntu 64bit, Android Studio 1.0.1, JDK7. He envuelto mi versión NDK con O-LLVM NDK y, como tal, estoy editando el archivo Android.mk ubicado en app/build/intermediates/ndk/debug (es el único archivo Android.mk dentro de mi directorio de proyecto), diferente al ubicación de la que el documento para O-LLVM da ejemplos.

Además, no hay un archivo Application.mk , así que de nuevo supongo que Gradle es responsable de las llamadas al compilador.

Cualquier ayuda sería muy apreciada.

Kyle

Información actualizada

build.gradle - (aplicación)

//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)

Tenga en cuenta: todavía no estoy pasando ningún cflags, estoy tratando de hacer que una compilación de Vanilla funcione primero


Sí, de forma predeterminada, el complemento de Android Gradle se regenera y utiliza su propio archivo Android.mk para compilar sus fuentes.

Puede desactivar esto y usar su propio archivo Android.mk en su lugar, configurando esto dentro de su archivo de configuración 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 } }

Tenga en cuenta que si solo necesita pasar sus propios cflags al Makefile generado automáticamente, puede configurarlos dentro de la cFlags "" para configurarlos dentro de android { ndk {}}