1、下载并配置NDK
NDK各版本下载地址在此http://blog.csdn.net/shuzfan/article/details/52690554,对应好各自系统。(压缩文件记得解压)
接下来将NDK存放路径添加到PATH环境变量。
首先打开当前用户的环境变量配置文件(可能文件名略有不同)
vim ~/. bashrc
然后在文件后面添加类似信息: export PATH=/ Android/android-ndk-rl0d: SPATH,其中
Android/android-ndk-rl0d是本地的NDK的存放路径。(这是我下载的版本)
添加完毕后,执行 source ~/ .bashrc来刷新刚刚设置的环境变量。设置完环境变量后,ndk- build命令就可以使用了,这是用来编译产生动态库的。
通过敲击ndk- build命令,没有提示未安装,则配置成功。
2、在Android项目中,新建一个MyNDK类并声明加载的动态库模块名称和native方法
3、在main目录下创建jni目录,并在下面创建3个文件Android.mk 和Application.mk
首先右击main目录——New——Folder——JNI Folder
然后右击jni目录——New——File生成Android.mk 、Application.mk两文件如下:
Android.mk的内容为:
LOCAL_MODULE表示加载模块(动态so库)的名称,
LOCAL SRC FILES表示需要参与编译的源文件(c或c++文件)。
Application. Mk为:
常用的配置项是APP ABI,它表示CPU的架构平台的类型,目前市面上
常见的架构平台有 armeabi、x86和mips,其中在移动设备中占据主要地位的是 ameobi,这也是大部分apk中只包含 armeabi类型的so库的原因。默认情况下NDK会编译产生各个CPU平台的so库,通过 APP_ABI选项即可指定so库的CPU平台的类型,比如 armeabi,这样NDK就只会编译armeabi平台下的so库了,而all则表示编译所有CPU平台的so库。
4、使用javah命令,产生MyNDK类(声明了native方法)的头文件
先在androidstudio中,点一下小锤子,就能编译项目,并在build/intermediates/classes/debug下生成对应着java文件的class文件如下:
使用命令行,跳转到main目录下,使用命令,编译出头文件并输出到jni目录
javah -d jni -classpath ../../build/intermediates/classes/debug com.example.zjj.user_define.MyNdk
-d jni,是将输出文件夹定为jni。
-classpath ……/debug,是指明当前位置到class文件的目录路径。
com.example.zjj.user_define.MyNdk,是“包名+类名”格式。
此时去jni目录下,可看到生成的头文件:
以及该头文件中的内容:
5、在jni目录下,新建.c 或.c++文件,实现头文件中的方法。
我这里是Myjni.c文件,内容如下:
#include "com_example_zjj_user_define_MyNdk.h"
#include<stdio.h>
JNIEXPORT jstring JNICALL Java_com_example_zjj_user_1define_MyNdk_getStrig
(JNIEnv *env, jobject thiz){
return (*env)->NewStringUTF(env,"hellofrom JNI in getString");
}
引进了stdio库,引进了步骤4中生成的.h头文件
实现了头文件中的方法
(*env)->NewStringUTF(env,"hellofrom JNI in getString")
//将String类型的"hello from JNI in getString"转为jstring
6、跳转到jni目录的父目录,使用ndk-build命令,生成so库
7、此时,MyNDK类中的native方法,已经用JNI实现完成了,在项目调用一下(MyNDK2同理可实现,只不过调用的是静态方法)
结果喜人:
成功了