浅析JNI交互技术

来源:互联网 发布:恐怖游轮解析知乎 编辑:程序博客网 时间:2024/05/22 09:42

  hello,菜菜兴致来啦,再来折腾一下,和大家一起分享一下个人对JNI的认识,比较浅显,旨在给正在寻找这方面资料的童鞋的一个易懂的入门文档(因为我到现在也只是实现了简单四则运算demo,哈哈~~~)。

JNI(Java Native Interface),这三个单词,我重点说一下Native方法,在Java开发中,一般童鞋不和底层交互的话,会很少用到这个关键字,甚至根本不知道有Native方法(菜菜本人是前段时间才知道),定义代码如下:

Code:
  1. public class TalkNative  
  2.   
  3.   {   
  4.   
  5.   public native void displayNative();   
  6.   
  7.   static   
  8.   
  9.   {   
  10.   
  11.   System.loadLibrary("test");   
  12.   
  13.   }   
  14.   
  15.   public static void main(String[] args) {   
  16.   
  17.   new TalkNative().displayNative();   
  18.   
  19.   }   
  20.   
  21.   }   

可以看到,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

写的时候,总感觉有些地方好像写错了,谁发现了欢迎批评斧正。

 

原创粉丝点击