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。
本文介绍了Android Studio中对NDK支持的变化,从1.3版本的gradle-experimental到2.2版本的cmake。重点讲解如何使用Gradle脚本来实现自动化交叉编译,包括配置gradle文件、设置任务执行ndk-build命令,并提供了清理任务。文章还提供了一个简单的gradle配置示例,展示了如何在每个module中配置以实现NDK编译和清理。
&spm=1001.2101.3001.5002&articleId=55190815&d=1&t=3&u=21875c2f6aac43ee8d64241824fa09b5)
7234

被折叠的 条评论
为什么被折叠?



