JNI和NKD入门系列二,mac环境下配置NDk,并在android studio上进行JNI开发

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方法

JNI和NKD入门系列二,mac环境下配置NDk,并在android studio上进行JNI开发

3、在main目录下创建jni目录,并在下面创建3个文件Android.mk 和Application.mk

首先右击main目录——New——Folder——JNI Folder

JNI和NKD入门系列二,mac环境下配置NDk,并在android studio上进行JNI开发


然后右击jni目录——New——File生成Android.mk 、Application.mk两文件如下:

JNI和NKD入门系列二,mac环境下配置NDk,并在android studio上进行JNI开发


Android.mk的内容为:

JNI和NKD入门系列二,mac环境下配置NDk,并在android studio上进行JNI开发


LOCAL_MODULE表示加载模块(动态so库)的名称,

 LOCAL SRC FILES表示需要参与编译的源文件(c或c++文件)。

 

Application. Mk为:

JNI和NKD入门系列二,mac环境下配置NDk,并在android studio上进行JNI开发

常用的配置项是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文件如下:

JNI和NKD入门系列二,mac环境下配置NDk,并在android studio上进行JNI开发

使用命令行,跳转到main目录下,使用命令,编译出头文件并输出到jni目录

javah -d jni -classpath ../../build/intermediates/classes/debug com.example.zjj.user_define.MyNdk

JNI和NKD入门系列二,mac环境下配置NDk,并在android studio上进行JNI开发

-d jni,是将输出文件夹定为jni

-classpath ……/debug,是指明当前位置到class文件的目录路径。

com.example.zjj.user_define.MyNdk,是包名+类名格式。

此时去jni目录下,可看到生成的头文件:

JNI和NKD入门系列二,mac环境下配置NDk,并在android studio上进行JNI开发

 

以及该头文件中的内容:

JNI和NKD入门系列二,mac环境下配置NDk,并在android studio上进行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库

JNI和NKD入门系列二,mac环境下配置NDk,并在android studio上进行JNI开发

 

7、此时,MyNDK类中的native方法,已经用JNI实现完成了,在项目调用一下(MyNDK2同理可实现,只不过调用的是静态方法)

JNI和NKD入门系列二,mac环境下配置NDk,并在android studio上进行JNI开发

结果喜人:

JNI和NKD入门系列二,mac环境下配置NDk,并在android studio上进行JNI开发

成功了