JNI,即Java Native Interface。它其实就是一套java与本地代码交互的接口或者说是一个协议。通俗的比喻,就是中国人讲中国话,日本人讲日本话,于是中国人碰到日本人,各说各话,无法交流。如果这个时候,中国人学会了英语,日本人也学会了英语,那么中国人日本人就可以用英语交流了,这就是要学习JNI的原因!Java语言无法直接调用C/C++代码,反之亦然,于是就有了JNI,帮助两者相互调用。当然,这一套机制并不是那么美好,总会有一些坑要踩,就像中国人跟日本人交流还需要借助英语,怎么看都有一些多余,我们直观的感觉就是,讲同一种语言更好。
在Java的JNI参考手册中,明确指出了使用JNI的一些缺陷,因此,在真实项目中,如果要使用JNI,尽量三思而后行。既然JNI不被推荐使用,那么学习JNI的意义是什么呢?作为一个Android平台的开发者,最幸福的事情就是系统开源,这个开源的系统实际上就是一个巨大的宝库,从底层到上层,可以汲取无数的知识,而在Android系统中,JNI技术是被大量使用的,要想深入的研究学习源码,JNI是必须要掌握的一步,因此,就先从Java语言的JNI基础开始吧!
工具的选择
Linux平台就不说了,在windows平台,编写C代码,最被推荐的工具当然是visual studio,功能丰富,但我个人感觉,太过于笨重臃肿,毕竟咱们不是真正的WinC开发者,不同的需求,决定了不同的选择,Eclipse对我们来说才更加亲切吧,我这里主要推荐三种,注意排名分先后
•Eclipse + MinGW GCC组合 咱们毕竟只需要玩玩标准C,而不是Windows平台上的开发者,不需要微软的SDK,这个组合很轻量级,还可以在Java代码与C代码之间轻松切换
•Code::Blocks 这个轻量级IDE自带MinGW GCC编译器,写写JNI中的C确实是够了,如果你不喜欢Eclipse写C,可以考虑一下
•Visual Studio 微软粉,并且想在Windows平台写写程序,那么vs是你唯一的选择
JNI编写流程
以上为官方文档中给出的编写流程,实际上我认为可以简化为四个步骤
1.在Java类中编写native方法
2.生成头文件
这里稍微注意一点,生成头文件之前,将项目编译一下,通常Eclipse工程会自动编译,但最好还是手动Build,编译生成class之后,执行javah命令自动生成头文件, 进入java工程根目录,执行以下命令,其中-o命令主要用于指定头文件名称 javah -jni -classpath ./bin -o Hello.h com.test.JniUtil
3.实现头文件中的方法
这里有几个小坑说明一下,编写JNI的本地方法,首先要导入jni.h头文件,这个文件在jdk目录里面,另外在windows平台的JNI中,还需要导入jni_md.h头文件,否则无法编译,其他平台不需要,注意头文件的排列顺序,jni.h必须在前。最后将我们生成的头文件也拷过来包含一下,这是一个很好的C编程习惯,能检查一些因手滑导致的错误。
4.编译成动态库,并在java中加载
我们知道,windows平台上的动态库是一个.dll的文件,Linux以及Android上,则是.so文件。最后在Java中加载动态库,则同样可以使用两种方式,如JniUtil类中的static代码块中,分别为System.loadLibrary和System.load函数。
通过如上四个大步骤,即完成了整个Java的jni编写流程,最后调用一下native方法,完成验证
public class test {
public static void main(String[] args) {
new JniUtil().sayHello();
}
}
在这里,我想细化一下在Eclipse中编写以及编译C代码的过程。
•成功配置MinGW GCC编译器环境 下载MinGW GCC编译器,并在Path环境变量中配置gcc命令,即将MinGW中的bin目录配置进去,这个过程就跟配置jdk是一样的,最后在命令行输入gcc --version命令检查是否配置成功
•在eclipse中安装CDT插件 推荐直接在插件商店中搜索安装,无需到处去下载离线包 选择eclipse工具栏中的Help–>Eclipse Marketplace进入插件商店,在其中搜索cdt并安装,成功安装后重启
•创建C语言工程
New Project中选择C项目
添加头文件路径
配置生成dll动态库
附上一个JNI的高清官方文档 http://download.csdn.net/download/yingshukun/10205404
内容丰富的在线文档 https://docs.oracle.com/javase/8/docs/technotes/guides/jni/spec/jniTOC.html
原作者:血色--残阳-CSDN
原文链接:http://blog.csdn.net/yingshukun http://blog.csdn.net/yingshukun/article/details/79053061
有想听Java架构知识讲解视频的同学 →→ ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
网友评论