web-dev-qa-db-fra.com

Comment utiliser mon propre fichier Android.mk avec Android Sudio

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

19
KyleM

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

25
ph0b