如何修改gradle文件以在NDK目录中运行Make?

时间:2017-03-03 20:53:35

标签: android-studio gradle makefile android-ndk task

我有一个Android应用程序,我需要在SWIG生成的本机代码中链接。 Makefile能够运行SWIG,安装生成的Java文件,并创建* .so。目前,我们必须进入本机代码目录并运行' make'然后手工将生成的Java存储在我们的RCS中,这是一个非常糟糕的主意。

我了解到我可以在Gradle中创建一个将运行的任务(){}和外部任务,例如' make'。这就是我所拥有的:

task buildSwig(type: Exec) {
    workingDir './app/src/main/cpp'
    commandLine 'make', 'distclean', 'swig', 'c++'
}

我把它放在' build.gradle'因此:

buildscript {

    repositories {
        jcenter()
    }

    dependencies {
        classpath 'com.android.tools.build:gradle:2.2.3'
        classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
        classpath 'me.tatarka:gradle-retrolambda:3.2.3'
        classpath 'com.getkeepsafe.dexcount:dexcount-gradle-plugin:0.3.1'
    }

}

allprojects {
    repositories {
        jcenter()
        maven {
            url "https://clojars.org/repo/"
        }
        flatDir {
            dirs 'libs'
        }
    }
    configurations.all {
        resolutionStrategy.force 'com.android.support:support-annotations:23.1.1'
    }
}

project.ext.preDexLibs = !project.hasProperty('disablePreDex')

task clean(type: Delete) {
    delete rootProject.buildDir
}

task buildSwig(type: Exec) {
    workingDir './app/src/main/cpp'
    commandLine 'make', 'distclean', 'swig', 'c++'
}

其中一个经过修改的标准生成的Gradle文件。我的问题是:1)我如何勾选' buildSwig'任务进入构建本身? 2)我使用正确的Gradle脚本吗?看来该任务被忽略了。当然,Makefile必须在其他所有内容之前运行。

此外,一旦纠正了此问题,Gradle构建过程是否会识别生成的Java文件?

1 个答案:

答案 0 :(得分:0)

在您的应用build.gradle中,您可以根据JavaCompile任务制作buildSwig类型的任务:

android {

    ......
    ......

    task buildSwig(type: Exec, description: 'Compile source') {
        commandLine 'make', '-C', file('src/main/cpp').absolutePath, 'distclean', 'swig', 'c++'
    }

    task cleanSwig(type: Exec, description: 'Clean object files') {
        commandLine 'make', '-C', file('src/main/cpp').absolutePath, 'distclean'
    }

    clean.dependsOn 'cleanSwig'

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