在Android Studio中利用gradle来自动编译jni

在最近的Android开发中,项目逐渐从Eclipse迁移到Android Studio中来,google官方现在并未在Android Studio中支持ndk的开发,但是我们可以利用gradle自动编译jni。

步骤

1.在新建项目中找到local.properties,在里面加入ndk的路径(ndk必须是r9以上):

1
ndk.dir=E\:\\Android\\ndk-r10d

2.在app\src\main中新建jni文件夹,在这里面存放要编译的c/c++文件以及Android.mk

3.在app中的build.gradle中加入两个task:ndkBuild和copyJniLibs,第一个task为ndk执行编译,第二个task将编译好的so库copy至jniLibs目录,这样才Android Studio最后打包的时候才会将so库打包进去:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
android {
compileSdkVersion 21
buildToolsVersion "21.1.2"
defaultConfig {
applicationId "com.xxx.yyy"
versionCode 1
versionName '1.0'
minSdkVersion 10
targetSdkVersion 21
}

buildTypes {
release {
minifyEnabled false
proguardFiles ('proguard-android.txt')
}
}

tasks.withType(JavaCompile) {
compileTask -> compileTask.dependsOn 'ndkBuild', 'copyJniLibs'
}

sourceSets {
main {
jni.srcDirs = []
jniLibs.srcDirs = ['src/main/jniLibs']
}
}
}

task ndkBuild(type: Exec) {
def ndkDir = project.plugins.findPlugin('com.android.application').sdkHandler.getNdkFolder()
commandLine "$ndkDir/ndk-build.cmd", '-C', 'src/main/jni',
"NDK_OUT=$buildDir/ndk/obj",
"NDK_APP_DST_DIR=$buildDir/ndk/libs/\$(TARGET_ARCH_ABI)"
}

task copyJniLibs(type: Copy) {
from fileTree(dir: file(buildDir.absolutePath + '/ndk/libs'), include: '**/*.so')
into file('src/main/jniLibs')
}

这两个task不要放在android{}中,放在android{}外即可,否则无法编译。其中NDK_APP_DST_DIR为编译后的库存放的文件夹,根据需求自己设定,我在这里是设置为的buildDir下的nkd文件夹

4.最后编译,Android Studo会自动执行ndkBuild和copyJniLibs这两个task

ps:也可以使用命令行的方式来执行这两个task

$ gradle ndkBuild copyJniLibs

使用这个命令前,请先找到gradle的目录下bin目录,并添加到环境变量中去

0%