Java与C语言混合编程方法.pdf
软件导刊2 0 0 75月号作者简介:何维(1 9 8 2-),男,湖北武汉人,研究方向为计算机软件与应用。J a v a 与C 语言混合编程方法探讨何维(武汉科技大学中南分校 现代教育技术学院,湖北 武汉,4 3 0 2 2 3)摘要:结合实例讨论了J a v a语言与C语言结合编程的方法。关键词:J a v a;C语言;本地接口;链接库中图分类号:T P 3 1 2 J A文献标识码:A文章编号:1 6 7 2-7 8 0 0(2 0 0 7)0 5-0 1 1 8-0 20前言J a v a语言具有分布式、多线程、安全高效和“与平台无关”等诸多优点,但正因其跨平台的特性,使得它与本地机器的内部联系成为其薄弱环节。例如,如何让J a v a程序控制硬件的驱动程序,或者是让J a v a程序和用其它编程语言编写的硬件接口相互通信。C语言程序和C+程序可以控制底层硬件。J a v a语言与C语言结合起来编程,能很好地解决J a v a程序对硬件接口的各类操作问题。1 J a v a结合C语言编程原理在J a v a代码中可以建立一种本地方法,称作“J a v a本地接口”(J a v a N a t i v e I n-t e r f a c e),但并不具体实现其功能。用J a v a编译器将包含此方法的J a v a源代码编译成与平台无关的二进制字节码。然后用J a v a h命令将此c l a s s文件转换成扩展名为h的C语言头文件。在转换过程中,J a v a h命令将只能在J a v a虚拟机上运行的二进制代码转换成可以被C语言编译器所识别的源代码。将此头文件包含在C语言的源代码中,用C语言来实现此本地方法的具体功能,即编写此方法所对应的C语言函数。最后将C语言源文件编译成对应平台的动态链接库文件,以便J a v a程序和C程序所调用。2声明本地接口在J a v a程序中,首先声明一个作为接口的本机方法,关键字是n a t i v e:/C P J a v a.J a v ap u b l i c c l a s s C P J a v a p u b l i c n a t i v e v o i dC J N a t i v e();s t a t i c S y s t e m.l o a d L i b r a r y(C J L i b );p u b l i c s t a t i c v o i dm a i n(S t r i n g a r g s)n e wC P J a v a().C J N a t i v e();代码中的S y s t e m.l o a d L i b r a r y()负责加载动态链接库文件。由于编译器在执行此类时,要首先执行s t a t i c代码段,所以也同时下载了l o a d L i b r a r y方法中的动态链接库文件。这里的库文件扩展名不用标明,系统会根据所在系统平台来判断是哪种类型。需要注意的是,在此例中作为本地接口的C J N a t i v e方法一定要标明n a t i v e类型,但不需要具体实现,参数也可不写。如果需要,可加入参数,例如:p u b l i c n a t i v e v o i dC J N a t i v e(i n t i);3编译并创建C语言头文件通过J a v a c命令将C P J a v a.J a v a源程序编译成C P J a v a.c l a s s程序文件:J a v a c C P J a v a.J a v a再用J a v a h命令生成扩展名为h的头文件:J a v a h-j n i C P J a v a在同一目录中生成了C P J a v a.h文件,其源码如下:/*D ON O TE D I TT H I SF I L E-i t i sm a c h i n e g e n e r a t e d*/#i n c l u d e/*H e a d e r f o r c l a s s C P J a v a*/#i f n d e f _ I n c l u d e d _ C P J a v a#d e f i n e _ I n c l u d e d _ C P J a v a#i f d e f _ _ c p l u s p l u se x t e r n C#e n d i f/*C l a s s:C P J a v a*M e t h o d:C J N a t i v e*S i g n a t u r e:()V*/J N I E X P O R Tv o i dJ N I C A L LJ a v a _ C PJ a v a _ C J N a t i v e(J N I E n v*,j o b j e c t);#i f d e f _ _ c p l u s p l u s#e n d i f算法与语言1 1 8软件导刊2 0 0 75月号#e n d i f注意,该文件由编译器自动生成,不要去修改它,以免接口调用错误。4在C语言程序中实现具体的接口功能现可将生成的.h头文件包含在C语言代码中。然后用C语言实现具体功能。在C P J a v a.h文件中已经包含了一个j i n.h头文件。该文件被放在J D K安装目录下的i n c l u d e文件夹中,它里面包含了一些重要的定义,如J N I E n v、j o b j e c t等类型,用以配合C编译器完成工作:#i n c l u d e 在具体实现的过程中,只需要关注函数J a v a _ C P J a v a _ C J N a t i v e:J N I E X P O R Tv o i dJ N I C A L LJ a v a _ C P-J a v a _ C J N a t i v e(J N I E n v*,j o b j e c t);其中,J N I E X P O R T和J N I C A L L是关键字,表示此函数要被J N I调用。用C语言具体实现此函数方法如下:#i n c l u d e C P J a v a.h J N I E X P O R Tv o i dJ N I C A L LJ a v a _ C P-J a v a _ C J N a t i v e(J N I E n v*e n v,j o b j e c t o b j);p r i n t f(T h i si sae x a m p l ef o rJ N I n );需要格外注意的是,J a v a和C两种语言中相同数据类型的调用方式和存储空间大小是不同的。并且J a v a的字符串为1 6位u n i c o d e码,而C语言 的 字 符 串 用8位A S C I I码,在进行混合编程时,一定要考虑数据类型和字符编码转换的问题。J a v a语言提供了很多可以进行类型转换的方法(即函数),限于篇幅,本文不再叙述具体用法。5连接动态链接库文件最后将C语言源程序编译连接成动态链接库文件。动态链接库的文件名要与J a v a源程序中l o a d L i b r a r y方法指明的动态链接库文件名一致,并且要存放于J a v a程序所在目录,否则将无法运行。6结论由于采用了本地方法,J a v a程序也就失去了与平台无关的特性。只需要将动态链接库文件放在不同的主流系统平台上进行编译,再让其随软件一起安装,这样就能很好地解决跨平台问题。J a v a提供了良好的异常处理控制性能,即使动态库出现问题,一般也不会导致系统瘫痪。我们还可以将一些严重影响J a v a执行性能的代码段交给其它执行效率高的语言完成,例如,大量数学运算的功能等一些J a v a不擅长的应用。这样可以大大提升J a v a程序的效率。另外,还可以用C语言程序调用J a v a程序代码。总之,从以上两个角度看,混合编程的意义非常重大。参考文献:1 辛运帏,饶一梅,张钧.J a v a程序设计M.北京:清华大学出版社,2 0 0 1.(责任编辑:刘君)P r o g r a mmi n gT e c h n i q u e o f C o mb i n i n gJ a v aw i t hCH EWe i(Wu h a nU n i v e r s i t y o f S c i e n c e a n dT e c h n o l o g y Z h o n g n a nB r a n c h,Wu h a n4 3 0 2 2 3,C h i n a)A b s t r a c t:T h i s a r t i c l e d i s c u s s e s t h e p r o g r a m m e t e c h n i q u e o f J a v a c o m b i n i n g w i t hC,a n du s e s a p r a c t i c a l e x a m p l e t oi l l u m i n a t e t h e a p p l i c a t i o no f J a v a n a t i v e i n t e r f a c e.K e yw o r d s:J a v a;Cl a n g u a g e;n a t i v e i n t e r f a c e;l i n kl i b r a r y算法与语言1 1 9