Android Studio使用新的Gradle构建工具配置NDK环境(一)

时间:2021-03-18 08:53:26
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编译并链接进来。
Android Studio使用新的Gradle构建工具配置NDK环境(一)
点击cleanNative task就可以clean。 下篇将使用ndk配置gradle来编译ndk。 http://blog.csdn.net/jasonwang18/article/details/55213539