流放之路击中附加诅咒:JNI全攻略之二――JNI基础

来源:百度文库 编辑:偶看新闻 时间:2024/04/19 18:15:58

JNI全攻略之二――JNI基础  

2006-12-09 18:06:45|  分类: JNI |字号 订阅

JNI全攻略之二――JNI基础

一、基础知识

       JNIjava native interface通常被成为Java本地方法,它是Java虚拟机实现的一部分,因此我们可以在任何的虚拟机上使用JNI。通过JNI我们可以完成和宿主计算机(就是安装JVM或者JDK的操作系统)以及在此系统上用CC++语言写的本地程序了!以下是Java虚拟机、JNI以及宿主计算机、本地程序以及java应用程序和类库的层次关系!

 

       从上面的图可以看出:JNIJava虚拟机的一部分,在它之上Sun公司提供了大量的类库,这些类库一般分门别类地以包的形式提供,如用于网络编程的net包、用于图形界面编程的swing(这是Sun公司提供给广大程序设计者的金山银山,在其类库中包含大量的设计理念、设计方法!毫不夸赞地讲、很负责任地讲它包含了软件发展至今的大部分思想!不信!它本身就是一个典型的OOP的典范:在IO中使用了装饰器模式,在Swing中使用了FlighWeight模式、Composite模式,在Collections Framework中使用Iterator模式、Decorator模式,同时它本身也是一个很优秀的Framework、其对网络的支持使其也是前所未有的……它是我们学习java最好的教程!且完全免费哦!)Java虚拟机也是一个程序它是用其它语言,如CC++实现的,我们现在研究的JNIJava虚拟机规范的一部分,在研究JNI后我们可以进一步研究Java虚拟机,从而可以研究操作系统之类的东西!java虚拟机是运行在操作系统上的程序而已,通过JNIjava应用程序可以和操作系统交互,例如我们的类库中的很多实现都是使用JNI,最最经常看到的就是Thread类中的Native方法。同时使用JNI我们可以让java和用CC++写的本地程序交互。

二、何时使用JNI

       一般的程序员很少会使用到JNI,甚至85%的人一辈子都不可能使用到JNI,但是在以下情况下,我们一般会使用JNI

1.         将已有的CC++应用程序或现有系统集成到Java应用程序中;

2.         在已有语言CC++集成Java虚拟机;

3.         实现Java虚拟机;

4.         理解语言集成的具体细节,例如如何垃圾回收、如何实现多线程、如何实现SWT中的某些细节……

       不过你想更好地使用java、更好地发挥java的特性,甚至只是为了增长你的知识,学习别人优秀的地方,你可以选择学习JNI。(学不学是你的事,研究不研究是其它人的事!竟然有此中人喧嚣“用不到的,中国人都用不到的”――谢谢你哦!那是你,不是所有的人!你不是别人的上帝!)学习JNI一般比较简单,这主要是由于JNIJVM实现的一部分,我们只不过是在调用系统提供的函数罢了!假如你喜欢研究、想提高自己的层次、想在此行业有所作为、请继续研究吧!下图是使用JNI的六个步骤。(具体步骤、你可以参照本系列的第一部分)

      

       使用JNI和本地程序交互包含以下六个步骤:

1.         创建一个java应用程序,其中包含若干个本地方法。本地方法具有以下标识:1.必须包含修饰符native2.没有方法体,即方法后以“;”结尾。其它类似与java中的其它种方法。包含本地方法的java程序有一个十分鲜明的特点:方法中有一个静态的语句块,该语句块完成加载实现此本地方法的动态链接库(DLL)。正因为其是静态语句块,因此它总是在类被构造前完成。

2.         使用javac编译刚才的包含本地方法的java源文件。结果会产生一个同名的类文件。

3.         接着使用javah“编译”此类文件,产生一个同名的头文件(主要用于描述类及其中的本地方法,后面有介绍!)

4.         根据前面产生的头文件,使用CC++语言实现此本地方法。

5.         VCCB等工具编译、连接你的CC++语言实现。产生一个动态连接库。

6.         这样你就可以象使用其它类一样使用此类了。(注意此时此DLL文件可以和类文件在同一个目录下,也可以放到系统可以搜索的路径下,就是环境变量Path下!)否则会报错哦!不信!你可以试试把上面的hello.dll改名为hello1.dll就可以看到错误了!你可以同时为解释器环境设置变量的方法增加路径,形如:

              java –Djava.library.path=具体路径加动态链接库的名字

例如:java –Djava.library.path=.hello 表示库的路径为当前目录下的名为hellodll文件。

       以上就是使用JNI的基本步骤了!下篇我们将讲述JNI中的数据类型和java数据类型的关系!

 

       最后,我还得提示一下,JNI不是一个很常用的方向!80%的程序员级别的可能一辈子都用不到!但是学完了,你可以知道什么地方需要它!学精了你的工具箱中应该有多了一个法宝!希望大家继续关注。