资源描述:
《Java与C语言混合编程方法.pdf》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、算法与语言Java与C语言混合编程方法探讨何维(武汉科技大学中南分校现代教育技术学院,湖北武汉,430223)摘要:结合实例讨论了Java语言与C语言结合编程的方法。关键词:Java;C语言;本地接口;链接库中图分类号:TP312JA文献标识码:A文章编号:1672-7800(2007)05-0118-02通过Javac命令将CPJava.Java源程序0前言2声明本地接口编译成CPJava.class程序文件:Java语言具有分布式、多线程、安全高在Java程序中,首先声明一个作为接JavacCPJava.Java效和“与平台无关”等诸多优点,但正因其口的本机方法
2、,关键字是native:再用Javah命令生成扩展名为h的头文跨平台的特性,使得它与本地机器的内部//CPJava.Java件:联系成为其薄弱环节。例如,如何让Java程publicclassCPJava{Javah-jniCPJava序控制硬件的驱动程序,或者是让Java程publicnativevoidCJNative();在同一目录中生成了CPJava.h文件,序和用其它编程语言编写的硬件接口相其源码如下:互通信。static{/*DONOTEDITTHISFILE-itisC语言程序和C++程序可以控制底层硬System.loadLibrary("CJLib
3、");machinegenerated*/件。Java语言与C语言结合起来编程,能很}#include好地解决Java程序对硬件接口的各类操作/*HeaderforclassCPJava*/问题。publicstaticvoidmain(String[]args){newCPJava().CJNative();#ifndef_Included_CPJava1Java结合C语言编程原理}#define_Included_CPJava}#ifdef__cplusplus在Java代码中可以建立一种本地方法,称作“Java本地接口”(JavaNativeIn
4、-代码中的System.loadLibrary("")负责extern"C"{terface),但并不具体实现其功能。用Java加载动态链接库文件。由于编译器在执行#endif编译器将包含此方法的Java源代码编译成此类时,要首先执行static代码段,所以也/*与平台无关的二进制字节码。然后用Javah同时下载了loadLibrary方法中的动态链接*Class:CPJava命令将此class文件转换成扩展名为h的C库文件。*Method:CJNative语言头文件。在转换过程中,Javah命令将这里的库文件扩展名不用标明,系统*Signature:()V只能在J
5、ava虚拟机上运行的二进制代码转会根据所在系统平台来判断是哪种类型。*/换成可以被C语言编译器所识别的源代需要注意的是,在此例中作为本地接JNIEXPORTvoidJNICALLJava_CP码。将此头文件包含在C语言的源代码中,口的CJNative方法一定要标明native类型,Java_CJNative用C语言来实现此本地方法的具体功能,但不需要具体实现,参数也可不写。如果(JNIEnv*,jobject);即编写此方法所对应的C语言函数。最后需要,可加入参数,例如:publicnativevoid将C语言源文件编译成对应平台的动态链CJNative(inti)
6、;#ifdef__cplusplus}接库文件,以便Java程序和C程序所调用。3编译并创建C语言头文件#endif作者简介:何维(1982-),男,湖北武汉人,研究方向为计算机软件与应用。118软件导刊·2007·5月号算法与语言#endifJNIEXPORTvoidJNICALLJava_CP-序所在目录,否则将无法运行。注意,该文件由编译器自动生成,不Java_CJNative6结论要去修改它,以免接口调用错误。(JNIEnv*env,jobjectobj);{⋯⋯由于采用了本地方法,Java程序也就4在C语言程序中实现具体的接口printf("Thisisa
7、examplefor失去了与平台无关的特性。只需要将动态功能JNI");链接库文件放在不同的主流系统平台上现可将生成的.h头文件包含在C语言⋯⋯进行编译,再让其随软件一起安装,这样代码中。然后用C语言实现具体功能。}就能很好地解决跨平台问题。Java提供了在CPJava.h文件中已经包含了一个需要格外注意的是,Java和C两种语良好的异常处理控制性能,即使动态库出jin.h头文件。该文件被放在JDK安装目录言中相同数据类型的调用方式和存储空现问题,一般也不会导致系统瘫痪。下的include文件夹中,它里面包含了一些间大小是不同的。并且Java的字符串为16我