算法与语言
Java与C语言混合编程方法探讨
何维
(武汉科技大学中南分校现代教育技术学院,湖北武汉,430223)
摘要:结合实例讨论了Java语言与C语言结合编程的方法。
关键词:Java;C语言;本地接口;链接库
中图分类号:TP312JA文献标识码:A文章编号:1672-7800(2007)05-0118-02
0前言2声明本地接口通过Javac命令将CPJava.Java源程序
编译成CPJava.class程序文件:
Java语言具有分布式、多线程、安全高在Java程序中,首先声明一个作为接JavacCPJava.Java效和“与平台无关”等诸多优点,但正因其口的本机方法,关键字是native:再用Javah命令生成扩展名为h的头文跨平台的特性,使得它与本地机器的内部//CPJava.Java件:联系成为其薄弱环节。例如,如何让Java程publicclassCPJava{Javah-jniCPJava序控制硬件的驱动程序,或者是让Java程publicnativevoidCJNative();在同一目录中生成了CPJava.h文件,序和用其它编程语言编写的硬件接口相其源码如下:互通信。static{/*DONOTEDITTHISFILE-itis
C语言程序和C++程序可以控制底层硬System.loadLibrary("CJLib");machinegenerated*/件。Java语言与C语言结合起来编程,能很}#include<jni.h>好地解决Java程序对硬件接口的各类操作/*HeaderforclassCPJava*/问题。publicstaticvoidmain(String[]args){
newCPJava().CJNative();#ifndef_Included_CPJava
1Java结合C语言编程原理}#define_Included_CPJava
在Java代码中可以建立一种本地方}#ifdef__cplusplus法,称作“Java本地接口”(JavaNativeIn-代码中的System.loadLibrary("")负责extern"C"{terface),但并不具体实现其功能。用Java加载动态链接库文件。由于编译器在执行#endif编译器将包含此方法的Java源代码编译成此类时,要首先执行static代码段,所以也/*与平台无关的二进制字节码。然后用Javah同时下载了loadLibrary方法中的动态链接*Class:CPJava命令将此class文件转换成扩展名为h的C库文件。*Method:CJNative语言头文件。在转换过程中,Javah命令将这里的库文件扩展名不用标明,系统*Signature:()V只能在Java虚拟机上运行的二进制代码转会根据所在系统平台来判断是哪种类型。*/换成可以被C语言编译器所识别的源代需要注意的是,在此例中作为本地接JNIEXPORTvoidJNICALLJava_CP码。将此头文件包含在C语言的源代码中,口的CJNative方法一定要标明native类型,Java_CJNative用C语言来实现此本地方法的具体功能,但不需要具体实现,参数也可不写。如果(JNIEnv*,jobject);即编写此方法所对应的C语言函数。最后需要,可加入参数,例如:publicnativevoid
将C语言源文件编译成对应平台的动态链CJNative(inti);#ifdef__cplusplus接库文件,以便Java程序和C程序所调用。}
3编译并创建C语言头文件#endif
作者简介:何维(1982-),男,湖北武汉人,研究方向为计算机软件与应用。