JNI使用

                             (本文为博主个人学习笔记,有错误或不足之处忘指正)

一、NDK环境搭建

NDK(Native Development Kit):Android程序运行在Dalvik虚拟机中,NDK允许用户使用类似C/C++之类的原生代码语言执行部分程序。Google改良了NDK的开发流程,对于windows环境下NDK的开发,在使用NDK r7之后的版本可以不再需要cygwin;因此本文是基于NDKr8e进行开发的。

1、下载NDK

NDK的下载可以在其官网进行下载(https://developer.android.google.cn/ndk/downloads/older_releases.html)

2、安装NDK

在使用eclipse开发android项目的时候,如果已经安装了ADT插件只需要对下载的NDK进行一些配置即可使用。

(1)解压下载的NDK压缩包

(2)添加NDK路径

打开eclipse->Windows->preferences->Android->NDK;在NDK Location中添加NDK解压路径。

二、JNI使用

1、创建Android工程,命名为Testjni

2、在该工程下建立jni文件夹

3、jni文件夹下建立Testjni.java文件,文件内容如下(这里的函数声明要加上native关键字)

JNI使用

4windows终端(cmd)进入到Testjni.java文件所在文件夹下,输入命令:javac Testjni.java ;该命令执行完成后会在当前目录下生成Testjni.class文件

JNI使用

5依然在Testjni.java文件所在文件夹下,如果没有则创建目录:/com/example/jni(该目录与Testjni.java文件的第一句指定包相同),并把Testjni.class复制到新建的目录下,然后在终端中输入:javah com.example.jni.Testjni(这时的终端目录与上一步的终端目录相同),此时会生成一个com_example_jni_Testjni.h文件;该文件就是对应于上面定义的Java接口的C/C++头文件,文件内容如下

JNI使用

6有了这个C/C++的头文件我们便可以使用C/C++来实现这个接口函数了;在jni文件夹下新建com_example_jni_Testjni.cpp文件,文件内容如下

JNI使用

7创建mk文件(类似于Makefile)该文件完成将C/C++代码链接编译成.so的库文件,这样Java才可以调用它,在jni文件夹下新建Android.mk文件,文件内容如下

JNI使用

其中LOCAL_PATH是C/C++代码所在目录,也就是我们的jni目录LOCAL_MODULE是要编译的库的名称。编译器会自动在前面加上lib,在后面加上.so。LOCAL_SRC_FILES是要编译的C/C++文件。

8编译生成动态库

   (1)新建一个Builder

a)Project->Properties->Builders->New,新建一个Builder。

b)在弹出的【Choose configuration type】对话框,选择【Program】,点击【OK】:

c)在弹出的【Edit Configuration】对话框中的Name编辑框内输入你为该编译器起的名字。

d)配置【Main】选项卡

Location中输入ndk-build.cmd所在路径(该文件在你下载的ndk压缩包中,解压后即可看到)

Working Directory中输入Android工程位置(即Testjni工程路径)具体情况如下


JNI使用

e)配置【Refresh】选项卡

勾选“Refresh resources upon completion”,

勾选“The entire workspace”,

勾选“Recuresively include sub-folders"

JNI使用

f)配置【Build options】选项卡

勾选“After a “Clean””,(该操作表示在你需要编译的时候只clean一下项目即可)

勾选“During manual builds”,

勾选“During auto builds”,

勾选“Specify working set of relevant resources”。

JNI使用


这时你可以发现上图顶部有错,表示你并没有配置完成,点击“Specify Resources…”勾选Testjni工程中新建的“jni“目录,点击”finish“。 点击“OK“,完成配置。 

JNI使用

   (2)启动编译

Project->clean当前工程;然后点击Debug按钮,你会发现在lib目录下已经生成了你所需要的库文件

JNI使用

9JAVA中调用JNI

调用前,先在当前工程的Src文件夹下建立包com.example.jni(名称与Testjni.java文件的首行表示的相同)再复制Testjni文件至该包下,结果如图

JNI使用


然后修改MainActivity.java文件完成调用

JNI使用

最后运行效果如图:

JNI使用