NDKLearning
网上一些介绍 AndroidStudio NDK 入门的教程,感觉都不是很完整和全面,也没有告诉初学 AndroidStudio NDK 的同学们一些需要注意的地方。
本文所介绍的是在 AndroidStudio 上搭建最佳的 NDK 开发环境,给使用 NDK 的开发人员最大的方便。
本人 AndroidStudio 版本 2.0。
本人 Gradle 版本 2.10。
1. Android NDK 开发工具准备
要进行 Android NDK 开发,首先要下载 Android NDK 开发工具。可以在 AndroidStudio 上面的下载,也可以自己下载好了,然后将 NDK 的路径设置为自己下载的 Android NDK 开发工具的路径。Android NDK 开发工具下载地址:http://wear.techbrood.com/tools/sdk/ndk/ 。
2. Gradle 的相关配置
gradle 插件不支持 NDK(当然用它也可以进行 NDK 开发,就是非常不方便),我们需要使用 gradle-experimental 插件。gradle-experimental 插件使用的时候与 gradle 插件稍微有点区别。
1. 我们来配置 Project 的 build.gradle
配置 Project 的 build.gradle 很简单就是将dependencies
中classpath
的值改为对应的 gradle-experimental 插件。
dependencies {
classpath 'com.android.tools.build:gradle-experimental:0.7.0'
}
2. 我们来配置 Module 的 build.gradle
先给出一个我配置的范例,然后说明那些需要注意的。
apply plugin: 'com.android.model.application'
model {
android {
compileSdkVersion = 23
buildToolsVersion = "23.0.2"
defaultConfig {
applicationId "com.lavor.ndklearning"
minSdkVersion.apiLevel 15
targetSdkVersion.apiLevel 23
versionCode 4
versionName "1.0.1"
}
}
android.ndk {
moduleName "lavor"
ldLibs.addAll(['log'])
cppFlags.add("-std=c++11")
cppFlags.add("-fexceptions")
platformVersion 15
stl 'gnustl_shared'
}
android.buildTypes {
release {
minifyEnabled = false
proguardFiles.add(file("proguard-rules.txt"))
}
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:appcompat-v7:23.1.1'
compile 'com.android.support:recyclerview-v7:23.1.1'
compile 'com.android.support:design:23.1.1'
}
- 首先在
apply
的时候我们引入的插件名称由'com.android.application'
变成了'com.android.model.application'
。 - 其次,在原来
android
的外层加入了一个model
层次。 - 再次,原来在
android
的里面的块,除了defaultConfig
外,全部移除android
块放入model
块中与android
并列,并且前面的名字加上android.
。 - 然后,
compileSdkVersion 23
与buildToolsVersion "23.0.2"
改成compileSdkVersion = 23
和buildToolsVersion = "23.0.2"
,中间加上了=
。 - 其次,添加上
android.ndk
块,块中的moduleName
表示 C/C++代码打包成 so 文件的名字。 - 再次,
android.buildTypes
块中的proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
改成proguardFiles.add(file("proguard-rules.txt"))
。 - 最后,注意
dependencies
块依然在最外层,它不在model
块中。
3. 开始 NDK 之旅
- 首先,在 Android 程序中添加一个 native 方法:
public native String getString();
。 - 其次,我们注意到添加的 native 方法的方法名是红色的,将鼠标移动到方法名上(注意不能是括号里面或者后面),然后按下
Alt+Enter
快捷键,弹出一些解决的方法建议,点击第一个Create Function...
。 - 再次,此时会自动建立一个与 java 目录同级的 jni 目录,在 jni 目录自动建立一个 c 文件,在 c 文件中实现刚才的 native 方法。
- 然后,稍稍修改一下 c 文件中实现的 native 方法。
JNIEXPORT jstring JNICALL Java_com_lavor_ndklearning_MainActivity_getString(JNIEnv *env, jobject instance) { // TODO return (*env)->NewStringUTF(env, "AndroidStudio NDK 开发最佳入门实践"); }
- 最后在 Android 程序中添加上加载 so 库文件的代码。
static { System.loadLibrary("lavor"); }
运行程序后界面如下:
AndroidStudio NDK 开发入门介绍完毕。程序源代码下载地址:https://github.com/lavor-zl/NDKLearning
注意:gradle 的版本不能太低,不然会出错,AndroidStudio 版本也不能太低不然可能没有集成 C/C++编译器,某些 1.7 的 JDK 可能会出错,重新下载一个 JDK 就好了,并设置 JDK 的路径。