Java代码中调用C/C++代码

来源:互联网 发布:淘宝充值卡代理 编辑:程序博客网 时间:2024/05/17 07:29
今日下午闲来无事,偶然翻起了一本java书,看到书中有提到Java代码对于c/c++代码的调用,突然感觉眼前一亮,以前没有接触过这个东西,竟也没有还有这种东西。废话不说,将我一下午的学习成果跟大家分享一下。
讲到这个东西,就不得不提一下强大的jni(Java Native Interface),从Java1.1开始,Java Native Interface(JNI)标准成为java平台的一部分,它允许Java代码和其他语言写的代码进行交互。JNI一开始是为了本地已编译语言,尤其是C和C++而设计的。那好了,既然这个东西是以一种服务的形式提供给开发者的,那么我就觉得我们不必在这个上面过多纠结其实现的机理,我们需要知道的就是他为c/c++代码在java虚拟机上面的运行提供了一个类似于桥梁的东西。
下来看步骤。
1、写java程序。
Java代码中调用C/C++代码
如上图所示,我们将需要在c/c++中实现的函数用关键字native关键字进行标识,关键字native提醒编译器该方法在外部定义了。
2、生成class文件
编写完程序以后,我们利用编译器或者cmd生成class文件,用编译器生成的话class文件会保存在bin目录当中,而利用cmd生成class文件则只需要运行javac HelloNative.java就可以了。
3、生成.h文件
这个是整个流程非常关键的一个步骤,在cmd中运行的语句如下:
Java代码中调用C/C++代码

对运行的语句做如下说明。
a) com.chnic.service是我的包名,HelloNative则为第二步中生成的class文件;
b) 运行的目录是在src目录下运行的;
c) 运行javah -classpath . com.chnic.service.HelloNative语句。
运行完之后,我们就会在src目录下看到新生成一个com_chnic_service_HelloNative.h的文件,这个就是我们需要生成的头文件。
4、创建c/c++工程
打开VC++6.0建立Win32 Dynamic-Link Library.然后把你刚才生成的头文件copy到工程的目录下。同时还要把jni.h,jni_md.h复制到这个目录下,因为你的C++头文件中包含了这两个头文件。它们可以从jdk目录中找到, ./Java/jdk1.6.0_21/include目录下和./Java/jdk1.6.0_21/include/win32目录下。然后你就可以在C++中实现你想要的功能了。
5、在c/c++工程中实现功能
Java代码中调用C/C++代码
代码如图所示,在生成的函数中调用response函数,response函数中实现自己想实现的一些功能。写好程序之后,我们需要编译连接生成dll文件,比如我的这个工程叫forJava,最后生成的dll文件也叫forJava.dll,随后,我将这个dll文件拷贝到C:/Windows/System 32的文件目录下。
6、编写Java测试代码
Java代码中调用C/C++代码
在java的main函数中调用刚刚我们写的greetings()函数,写完之后,最终要的一点就是我们要装入forJava.dll,所以最后用System.LoadLibrary("forJava")。
7、运行、测试结果
编写好测试代码以后,一切就都准备就绪了,我们给出最终的运行结果。
Java代码中调用C/C++代码
最终的运行结果跟我们在c/c++中写的逻辑是一致的,这样就完成了Java代码对c/c++代码的调用。

0 0