NDK开发 - Android Studio环境搭建

0.4.0Experimental Plugin版本所以在使用的时候和正式版本的配置还是有挺大的差别的。http://tools.android.com/tech-docs/new-build-system/gradle-experimental/0-4-0是官方文档,上面给出了Experimental Plugin版本使用说明,但是实际使用中还是发现了不少问题,比如签名配置。

0x00 Change Config

主要修改包括三个文件

1
2
3
./app/build.gradle
./build.gradle
./gradle/wrapper/gradle-wrapper.properties

###./gradle/wrapper/gradle-wrapper.properties
每个插件版本都对应着一个gradle版本

Plugin Version Gragle Version
0.1.0 2.5
0.2.0 2.5
0.3.0-alpha3 2.6
0.4.0 2.8
0.6.0-alpha1 2.8
0.6.0-alpha5 2.10

因为我使用的是0.4.0版本所以需要将./gradle/wrapper/gradle-wrapper.properties中配置改为

1
2
3
4
5
6
#Wed Oct 21 11:34:03 PDT 2015
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-2.8-all.zip

###./build.gradle
修改classpath为当前的0.4.0版本插件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle-experimental:0.4.0'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
allprojects {
repositories {
jcenter()
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}

###./app/build.gradle
./app/build.gradle文件需要改动的东西比较多,很多配置与正式版本不一样。

  • 'com.android.model.application'替换'com.android.application'如果是library模块改为com.android.model.library
  • android外层添加根节点model { }
  • 需要添加=给属性赋值
  • 添加元素需要用add函数

下面这个是我自己项目的配置:

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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
apply plugin: 'com.android.model.application'
model {
def signConf
android {
compileSdkVersion = 23
buildToolsVersion = "23.0.2"
defaultConfig.with {
applicationId = "com.example.gnaix.ndk"
minSdkVersion.apiLevel = 15
targetSdkVersion.apiLevel = 22
versionCode = 1
versionName = "1.0"
buildConfigFields.with {
create() {
type = "int"
name = "VALUE"
value = "1"
}
}
}
}
//编译设置
android.buildTypes {
release {
minifyEnabled = true
proguardFiles.add(file('proguard-rules.pro'))
signingConfig = signConf
ndk.with {
debuggable = false
}
}
debug{
minifyEnabled = false
proguardFiles.add(file('proguard-rules.pro'))
ndk.with {
debuggable = true
}
}
}
//签名设置
android.signingConfigs {
create("myConfig") {
keyAlias = 'gnaix'
keyPassword = '990828785'
storeFile = new File('/Users/xiangqing/Documents/workspace/android/gnaix.jks')
storePassword = '990828785'
storeType = "jks"
signConf = it
}
}
//ndk定义
android.ndk {
moduleName = "native" //设置库(so)文件名称
//CFlags.add("-DCUSTOM_DEFINE")
ldLibs.addAll(["log", "android", "EGL", "GLESv1_CM"])
//ldFlags.add("-L/custom/lib/path")
stl = "stlport_static"
}
//ndk编译参数
android.productFlavors {
create("arm") {
ndk.abiFilters.add("armeabi")
}
create("arm7") {
ndk.abiFilters.add("armeabi-v7a")
}
create("arm8") {
ndk.abiFilters.add("arm64-v8a")
}
create("x86") {
ndk.abiFilters.add("x86")
}
create("x86-64") {
ndk.abiFilters.add("x86_64")
}
create("mips") {
ndk.abiFilters.add("mips")
}
create("mips-64") {
ndk.abiFilters.add("mips64")
}
// To include all cpu architectures, leaves abiFilters empty
create("all")
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:23.2.0'
}

0x01 Signing Config

下面这段代码是官方文档给出的签名配置,但是在实际编译中报错了。改成上面的配置则可以了。

PS:之前我都是新建gradle.properties文件配置签名信息,方便多项目应用,可是在这里好像不行。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
apply plugin: "com.android.model.application"
model {
android {
compileSdkVersion = 23
buildToolsVersion = "23.0.2"
}
android.buildTypes {
release {
signingConfig = $("android.signingConfigs.myConfig")
}
}
android.signingConfigs {
create("myConfig") {
storeFile = new File("/path/to/debug.keystore")
storePassword = "android"
keyAlias = "androiddebugkey"
keyPassword = "android"
storeType = "jks"
}
}
}

0x02 Source Set

默认情况下C/C++文件是存放在src/main/jni目录下。可以配置android.sources节点改变路径。不过我还是喜欢默认路径。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
model {
android {
compileSdkVersion = 22
buildToolsVersion = "22.0.1"
}
android.ndk {
moduleName = "native"
}
android.sources {
main {
jni {
source {
srcDir "src"
}
}
}
}
}

如果有已经编译好的SO包要添加引用:

1
2
3
4
5
6
7
8
9
10
11
12
android.sources {
main {
jniLibs {
dependencies {
library file("./libs/armeabi/libnative.so") abi "armeabi"
library file("./libs/armeabi-v7a/libnative.so") abi "armeabi-v7a"
library file("./libs/x86/libnative.so") abi "x86"
library file("./libs/mips/libnative.so") abi "mips"
}
}
}
}

注意这里需要写SO包命全称,加上lib。

0x03 Other Config

文档中还介绍了将SO作为一个独立的lib编译的方式,在实际操作中我也失败了,当时项目时间紧也就没有研究了=_=#。
文档示例/lib/build.gradle:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
apply plugin: "com.android.model.native"
model {
android {
compileSdkVersion = 21
}
android.ndk {
moduleName = "hello"
}
android.sources {
main {
jni {
exportedHeaders {
srcDir "src/main/headers"
}
}
}
}
}

文档中还提到其他配置的使用方法,因为项目中没有用到,我也没试过。
示例项目地址https://github.com/gnaix92/as-ndk

下一篇将会介绍SO开发的JNI调用