AndroidStudio版本:1.5.1
开篇不多说废话,本文主要分两部分:
- ndk的安装与配置
- jni在androidstudio的demo
ndk的安装与配置
1.下载ndk,打开File->Setting,然后搜索sdk,如图所示,在System Settings 目录下选择Android SDK,然后选择SDK Tools,勾选上NDK并下载,这里我已经安装好了
2.配置ndk目录,选择File->Project Structure,下载后的ndk放在sdk的目录下,选择即可
3.还需在gradle.properties文件中配置
android.useDeprecatedNdk=true
这是因为会产生一个错误
做了上面的三部后ndk就算配置好了。
JNI Demo
这个过程我概括为两步
1.编写相关代码
这个过程就是在Java代码中编写native方法,并在c代码中编写对应的方法
2.配置和引入库
在Moudule的build.gradle文件中配置库,并在java代码中引入库
详细如下:
1)新建一个Module,然后在MainActivity中编写如下代码
这时候会发现hello是红色的,这是因为编译器没能找到其对应的c/c++的实现
2)在src/main目录下,新建jni文件夹,并在其中新建一个c文件,比如这里我叫做hello.c
在其中写如下代码:
其中方法名是 Java_全类名_方法名,但包名之间的.改为下划线,如下Java_com_pngfi_jnidemo_MainActivity_hello
#include<jni.h>
jstring Java_com_pngfi_jnidemo_MainActivity_hello(JNIEnv* env,jobject obj){
return (*(*env)).NewStringUTF(env,"hello jni");
}
3)AndroidStudio简化了Android.mk文件的配置,会自动生成,我们只
在Module的build.gradle文件的defaultConfigs中配置如下
defaultConfig {
applicationId "com.pngfi.jnidemo"
minSdkVersion 14
targetSdkVersion 23
versionCode 1
versionName "1.0"
ndk {
moduleName "JniDemo"
ldLibs "log", "z", "m"
abiFilters "armeabi", "armeabi-v7a", "x86"
}
}
其中moduleName 就是我们要引用的c库的名字,abiFilters 配置为不同类型的cpu产生对应的.so文件
4)在java代码中引入库,在MainActivity中加入如下代码
static {
System.loadLibrary("JniDemo");
}
这是一个静态代码块,这里的JniDemo即上一步配置的库名字,到此我们只需在MainActivity中添加一个TextView并调用
textView.setText(hello());
点击运行即可,结果如下所示
关于其他
上面我们说到AndroidStudio中简化Android.mk文件的配置,其实它会帮我们生成对应的文件,编译Module,即可在如下图的目录查找到
另外,上面在c代码写方法名的时候是不是太麻烦了呢,javah命令可以帮助我们生成头文件,从而我们只需拷贝过来实现方法体即可。
如果你是的jdk版本>=1.7那么只需,如下在控制台中进入java目录下,执行javah 全类名 即可生成.h文件
我们把头文件剪切掉,放入jni文件夹。
在.c文件中引入头文件,把对应的方法声明拷入源文件,实现即可,如下
#include "com_pngfi_jnidemo_MainActivity.h"
JNIEXPORT jstring Java_com_pngfi_jnidemo_MainActivity_hello(JNIEnv *env, jobject obj) {
return (*(*env)).NewStringUTF(env, "hello jni");
}