Android studio对于ndk的支持历经了两次变化:
1. 1.3版本引入了gradle-experimental,工程gradle设置与普通APP的设置大相径庭,gradle设置更改较多
2. 2.2版本引入了cmake系统,也是我认为最好用的

编译环境是Android studio 2.2,目前实现方式主要有有三种:
1.使用gradle脚本,task编写ndk-build命令行
2.使用gradle脚本,ndk+externalNdkBuild,或者gradle-experimental的model设置
3.使用最新的cmake脚本

另外,你也可以使用shell脚本自定义一套toolchain编译工具链来编译。

下面我们来分析如何用gradle脚本来实现自动化交叉编译。

Android studio 对于ndk的支持历经了好几个版本,采用了不同的设计,从1.3版本的model到2.2的cmake,所以采用何种配置成为了头疼的事,但不管Android studio如何编译,ndk编译的本质没有变化,即采用ndk目录下的可执行文件ndk-build来编译也就是采用命令行的形式编译ndk是永远可行的,我们的思路就是利用gradle脚本模拟ndk-build命令。

gradle文件配置如下
apply plugin: 'com.android.library'

android {
    compileSdkVersion 25
    buildToolsVersion "25.0.1"
    defaultConfig {
//        applicationId "com.jason.test"
        minSdkVersion 16
        targetSdkVersion 25
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"

    }


    sourceSets {
        main {
            jni.srcDirs=[]
            jniLibs.srcDirs 'src/main/libs'
        }
    }
    task ndkBuild(type: org.gradle.api.tasks.Exec) {
        workingDir file('src/main/jni')
        commandLine getNdkBuildCmd()
    }
    tasks.withType(JavaCompile) {
        compileTask -> compileTask.dependsOn ndkBuild
    }
    task cleanNative(type: Exec) {
        workingDir file('src/main/jni')
        commandLine getNdkBuildCmd(), 'clean'
    }
    clean.dependsOn cleanNative

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:25.0.1'
}


def getNdkDir() {
    if (System.env.ANDROID_NDK_ROOT != null)
        return System.env.ANDROID_NDK_ROOT
    Properties properties = new Properties()
    properties.load(project.rootProject.file('local.properties')
            .newDataInputStream())
    def ndkdir = properties.getProperty('ndk.dir', null)
    if (ndkdir == null)
        throw new GradleException("NDK location not found. Define location with ndk.dir in the local.properties file or with an ANDROID_NDK_ROOT environment variable.")
    return ndkdir
}
def getNdkBuildCmd() {
    def ndkbuild = getNdkDir() + "/ndk-build"
    /*if (Os.isFamily(Os.FAMILY_WINDOWS))
        ndkbuild += ".cmd"*/
    return ndkbuild
}



直接运行就可以实现ndk的交叉编译,每一个module下的gradle都做这样的配置,同时工程关联,直接运行app就可以将library的module编译并链接进来。


点击cleanNative task就可以clean。
下篇将使用ndk配置gradle来编译ndk。

Logo

这里是“一人公司”的成长家园。我们提供从产品曝光、技术变现到法律财税的全栈内容,并连接云服务、办公空间等稀缺资源,助你专注创造,无忧运营。

更多推荐