hello,菜菜兴致来啦,再来折腾一下,和大家一起分享一下个人对JNI的认识,比较浅显,旨在给正在寻找这方面资料的童鞋的一个易懂的入门文档(因为我到现在也只是实现了简单四则运算demo,哈哈~~~)。
JNI(Java Native Interface),这三个单词,我重点说一下Native方法,在Java开发中,一般童鞋不和底层交互的话,会很少用到这个关键字,甚至根本不知道有Native方法(菜菜本人是前段时间才知道),定义代码如下:
- public class TalkNative
- {
- public native void displayNative();
- static
- {
- System.loadLibrary("test");
- }
- public static void main(String[] args) {
- new TalkNative().displayNative();
- }
- }
可以看到,Native方法和普通方法的区别就是前面加上了这个关键字,当然,它又像抽象方法,不能有方法体。
那么,这样一个Native方法,怎样去实现呢?它不是在抽象类里面,不能由子类去实现。接下来,菜菜来和大家一起学习。
Native,翻译为中文:本地的, 也就是说这个方法定义之后是个本地方法。BYW,java虽然靠jvm的强大,能够跨平台神马的(太多术语菜菜忘了),但是它也有局限性,它自己的API不能访问操作系统底层(like 硬件),而且在一些情况下,运行速度不如c++。于是,Java利用Native这个方法来扩展自己,使用Native方法就能够访问底层,能够访问到自己写的c/c++库。说到这里,可能大家都想到了,那个Native的方法应该就是在c或者c++里面实现的啦。
继续看上面的代码,有一个static代码块,意思就是程序一运行,就自动执行了静态块的代码,也就是加载了test这个库,所以在入口函数里面,调用native方法之前,native方法已经被实现了。 读者可以直接把上面的代码copy一下,javac一下,再javah一下,生成一个.h头文件(学过C的童鞋知道,.h文件是干什么用的)
接下来就需要利用到C/C++的库文件),可以是自己书写,也可以调用别人写好的(前提是知道别人提供的接口),由于菜菜不大懂C/C++,所以就不给出具体代码,随后会附上相关链接。
JNI流程图
虽然在本文,没有C/C++代码,但是我想给新手一个提醒,在自己书写C代码时,注意两个关键词JNIEXPORT、JNICALL,
以及其中的数据类型(java中的int,在C里面定义为jint,以此类推),最重要的,别忘记include刚刚编译的头文件和JNI.h。
随后,把写好的C/C++文件编译生成dll文件(名称和上面java代码中的“test”一致,在linux中是.so文件),至于生成dll的命令,大家还是查一下吧,我就不复制粘贴啦。
上面都完成了之后,把dll放在java文件的同目录下,就可以运行啦。
扩展阅读:http://www.enet.com.cn/article/2007/1029/A20071029886398.shtml
http://baike.baidu.com/view/1272329.htm
写的时候,总感觉有些地方好像写错了,谁发现了欢迎批评斧正。