AndroidStudio使用NDK编译本地代码

AndroidStudio支持多种方式调用NDK编译本地代码,默认的Gradle可以支持NDK编译,但如果使用gradle-experimantal,可以提供更好的支持。

AndroidStudio下NDK编译方式

使用废弃的NDK

普通情况使用废弃的NDK,只需要在gradle.properties中加入配置(如果不加入则报错):

1
android.useDeprecatedNdk=true

这样做只是为了防止gradle编译报错,为了正确编译还需要修改相应模块gradle文件,加入编译配置如:

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
android {
compileSdkVersion 25
buildToolsVersion "25.0.0"

defaultConfig {
minSdkVersion 15
targetSdkVersion 25
versionCode 1
versionName "1.0"
ndk {
moduleName "myjni"
ldLibs "log", "jnigraphics"
abiFilters "armeabi", "armeabi-v7a"
cFlags "-mtune=atom"
stl "gnustl_shared"
}
}
sourceSets.main {
jniLibs.srcDir 'src/main/libs'
}
productFlavors {
x86 {
ndk {
abiFilter "x86"
}
}
mips {
ndk {
abiFilter "mips"
}
}
}
buildTypes {
'''
}
}

如果为提高速度直接用了已编译的lib而暂时不需要编译NDK,可以配置jni不编译:

1
2
3
4
android{
...
sourceSets.main.jni.srcDirs = [] //disable automatic ndk-build call
}

使用gradle-experimental

首先我们需要修改工程的gradle配置为gradle-experimental:

1
2
3
4
5
6
7
8
9
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle-experimental:0.9.1'
//classpath 'com.android.tools.build:gradle:2.3.1'
}
}

然后所有的模块配置都要加上model:

1
2
apply plugin: "com.android.model.application"
apply plugin: 'com.android.model.library'

完整的gradle配置:

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
apply plugin: 'com.android.model.library'

model {
android {
compileSdkVersion 25
buildToolsVersion "26.0.0"

defaultConfig {
minSdkVersion.apiLevel 14
targetSdkVersion.apiLevel 25
versionCode 1
versionName "1.0"
}

ndk {
moduleName "guetzli"
cppFlags.add("-std=c++11")
ldLibs.addAll(["log", "z", "jnigraphics"])
stl "c++_static"
abiFilters.addAll(['armeabi', 'armeabi-v7a'])
}
}

android.buildTypes {
debug {
ndk {
cppFlags.add('-DNDK_DEBUG')
}
}
release {
minifyEnabled false
proguardFiles.add(file('proguard-rules.pro'))
}
}
}

app 模块的配置也要相应改变:

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
apply plugin: 'com.android.model.application'

model{
android {
compileSdkVersion 25
buildToolsVersion "26.0.0"
defaultConfig {
applicationId "com.hzy.guetzli.demo"
minSdkVersion.apiLevel 14
targetSdkVersion.apiLevel 25
versionCode 1
versionName "1.0"
}
}

android.signingConfigs {
create("release") {
storeFile file('demokey.jks')
storePassword 'demokey'
keyAlias 'demokey'
keyPassword 'demokey'
}
}

android.buildTypes {
release {
useProguard true
proguardFiles.add(file('proguard-rules.pro'))
signingConfig = $("android.signingConfigs.release")
}
}
}

这样以后,本地代码就可以编译,而且AndroidStudio还支持本地代码高亮,调试等操作。

当前网速较慢或者你使用的浏览器不支持博客特定功能,请尝试刷新或换用Chrome、Firefox等现代浏览器