NDKLearning
#AndroidStudio NDK 开发最佳入门实践
网上一些介绍 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 的路径。
