2024年6月7日发(作者:)
2010年第1期
中图分类号:TP311.1 文献标识码:A 文章编号:1009—2552{2010)01—0068—03
Java调用VC++DLL实现串口GPS的访问
王聪华,王建国
(泰山学院信息科学技术学院,泰安271021)
摘要:给出了Java通过JNI技术调用VC++DLL的方法,并设计了含有串口GPS类和Java导出
函数的DLL,该DLL既可以用于Java访问串口GPS,也可以用于VC++访问串口GPS,实现了
Java和VC++共用的动态连接库设计。
关键词:动态连接库;JNI技术;串口GPS;VC++;Java
Java to call VC++DLL to realize the
access of serial port GPS
WANG Cong-hua。WANG Jian.guo
(School ofInformation Sdenee andTechnology,TaishanUniversity,Taian 271021,China)
Abstract:In this paper,the method of Java to call VC++DLL is provided by technology of JNI,and the
DLL including seril aport class of GPS and export function of Java are designed which con be USed to access
ersial port of GPS by Java as well as VC++.The dynamic link library shared by Java and VC++is realized.
Key words:dynamic hnk library;technology of JNI;serial port GPS;VC++;Java
0 引言
Java语言以其跨平台及完全面向对象的特性深
三种:JNI、Jawin和Jacob。其中JNI技术是实现跨平
受广大计算机软件开发者的喜爱,许多软件开发人
员纷纷由其它高级语言编程转向了Java语言,使得
它的应用领域也越来越广泛。然而每个软件开发人
员不得不面临这样的问题,如何重用日积月累下来
台开发以及实现与其它高级语言通信的很好的工
具¨I2】。就串口的DLL访问来说,在研究中发现使
用JNI技术比较容易,并不要花费很多功夫像Jawin
和Jacob那样去配置环境。
Java通过JNI技术访问DLL的设计主要遵循以
的VC抖代码问题,特别是一些直接与硬件有关的
代码,已经在实际使用中反复检验正确无误的代码,
如果因为与Java的混合编程问题而弃之不用,岂不
违背了代码的可重用性。Java提供的调用本地已编
下步骤:
(1)编写Java类,在类中用System.1oadLibrary()
声明调用的DLL库名,并以关键词native为前缀,声
明将要调用的本地方法,只声明,不实现。
(2)编译Java程序文件,生成clsas文件,并用
Javah工具为Java类生成对应的.h头文件,并在头
译的函数库的方法,已经为后来软件开发人员提供
了Java与其它高级语言混合编程的接口_1-2]。本文
主要以访问串口GPS为背景,探讨通过Java的JNI
Java Native Interface)技术访问VC++串口GPS类的
文件中第一句包含jni.h头文件。Javah工具生成的
头文件中包含能为C编译器识别的本地方法的声
明,声明中包含能为C函数代码访问的方法和属性
的参数,这些参数用标准的C语言类型定义。
收稿日期:2009—07—13
作者简介:王聪华(1959一),男,教授,博士研究生,主要研究方向为
虚拟现实技术及应用,遥感影像数据处理
方法,给出接口编程中的关键问题及可供Java访问
的VC++串口GPS类的动态连接库。
l Java的JNI技术
在Java中调用DLL动态链接库的方法通常有
一
68一
(3)编写VC++代码实现.h头文件中声明的函
数,将JDK中的头文件jni.h和jni—md.h连同Javah
生成的头文件复制到VC++代码所在目录下,在实
System.out.prinfln(”开始”+Stal't);
stop cO1TlIn.JStopWatch();
System.out.println(”停止”+stop);
}
}
现代码文件中包含Javah生成的头文件,在编写代
码时使用其中定义好的数据类型作为函数的输入和
返回数据类型进行编程。
以上代码中有三个staitc函数SetComm()、
WatchSerialComm()和JStopWatch(),在头JSerial—
(4)再编译编写好的Java代码,在Java中就可
以调用DLL库函数了。
2 Java访问的VC++DLL设计
在VC++中,可以设计导出函数或导出类DLL,
以供VC++访问DLL中的函数和类。但在Java中仅
能访问导出函数的DLL,而不能设计导出类的DLL
直接供Java访问,这样Java就不能访问VC什的类
了,而类是VC++面向对象的程序设计的优势所在,
为了弥补这个不足,我们考虑仍然按类封装设计
DLL,仅将Java需要访问的函数设计成导出函数供
Java访问,这些导出函数在DLL中去访问封装好的
类及其成员函数,而原有在DLL中设计好的类不改
变。本文以一个VC++串口GPS类的DLL设计为
例,来说明Java如何访问VC++串口类的DLL。
2.1 Java环境端的设计
在Java环境端遵循JNI技术访问DLL设计的前
两步,先设计一个类JSerialComm,声明调用的DLL
库SerialComm.du,再声明在DLL库中要实现的本地
方法,编译成class文件,用命令javah生成JSeria1.
Comm.h文件。类JSerialComm的代码如下:
public class JSerialComm{
public JSerialComm(){}//空的构造方法
static{
System.1oadLibrary C SerialComm");//调用
DLL库SerialComm.dll
}
public native static void SetComm();//串口
初始化和设置
public native static int WatchSerialCornm();//
开始检测串口
public native sattic int JStopWatch();//停止
检测串口
public sattic void main(String[]args)
{
int start,stop;
JSefi ̄Comm coInlTl=new JSefialComm();
COITIITI.SetComm();
start=comm.WatchSerialComm();
Comm.h文件有它们的导出函数声明:
JNIEXPORT jint JNICALL Java—JSerialComm—
WatchSerialComm(J-NIEnv*,jclass);
JNIEXt ̄RT jboolean JNICALL Java JSerialComm
一
¥etComm(JNIEnv*,jclass);
JNIEXPORT jint JNICALL Java~JSerialComm—
JStopWatch(JNIEnv*,jclass);
这三个函数是Java通过VC++DLL访问串口
GPS类的导出函数,本文要在VC++环境中实现这
些函数。
2.2设计Java访问的VC++DLL
本文已经有了一个串口GPS类CGPSSerial—
Comm,这个类的设计以及GPS通信,读者可参见文
献[4]。为了讨论问题方便本文仅列出该类的主要
成员函数,这些函数是在实现Java访问的导出函数
时要调用的:
//串口初始化和设置函数
BOOL Init(char con[]=”coml”,DWORD baud=
CBR
4800,BYTE parity=NOPAR1TY,
BYTE databits=8,BYTE stopbits=O ̄PBIT,
DWORD dwCommEven ̄=EV
—
RXFLAG I EV
CTS,UINT nBufferSize=512);
BOOL StartWatch();//开始监测GPs串口
BOOL StopWatch();//停止监测GPS串口
在VC6.0中的MFC可以支持三种形式的DLL,
包括非MFC动态链接库、MFC常规动态链接库和
MFC扩展动态链接库 ]。而设计一个导出类可以
在设计MFC常规动态链接库中用关键字一declspee
(dllexport),也可在设计扩展动态链接库中使用AFX
EXT
—
CLASS导出宏,而本文的设计选择后一种,
主要的理由是这样设计的DLL既可以被VC++访问
导出类,也可以被Java访问导出函数,这些函数已
在JSerialComm.h列出了它们的声明,见2.1节,在
VC++实现DLL时作为Java访问只需要考虑冠以关
键字JNIEXPORT的导出函数,而作为VC++访问则
在定义串口GPS类CGPSSerialComm时冠以AFX
EXT
CIASS。
按MFC AppWizmd向导设计MFC扩展DLL(使
一
69—
用共享MFC DLL),设工程名为SerialComm。
建立SerialComm.DLL的工程,在定义串口GPS
类CGPSSerialConrn的class后面加关键字AFX
retum 1;
}
EXT
—
将JSerialCoⅡ1m.h复制到VC工程目录中,可以
将jni.h和jni—md.h复制到工程目录中,并在JSeri. CLASS,在CGPSSefiMComm类文件中添加:#include”
JSerialComm.h”,实现冠以关键字JNIEXPORT的导出
函数如下:
JNIEXPORT jint JNICAU.Java—JSerialComm—
alComm.h头文件中的加入}}include”jni.}l,,,然后编
译生成SerialComm.dU,即完成了既可被Java访问也
可被VC++访问的VC+DLL设计。
2.3 Java调用VC++DLL
WatchSerialComm(JNIEnv*,jclass)
{ 将2.2节生成的SerialComm.dU文件复制到
JSerialComm.java所在的目录中,在J ̄fiMComm.iava
去掉最后两行代码,然后再编译生成JSefialComm.
CGPSSerialComm Comm;//声明串口GPS类
对象Comm
BOOL bStartWatch;
class文件,这样在iava中运行.class,可以看调用
SetComm(),WatehSefialComm()开始检测串口。当然
我们可以去掉J ̄fiMComm.iava中的main方法再编
译生成JSerialComm.class,这个Java类结合动态连接
bStartWatch=Comm.StartWatch();//
if fbStartWatch==TRUE)
return 1;
else
retum 0;
库SefialComm.dll可供任何Java访问串口GPS。
3 结束语
—
}
J-NIEXPORT void JNICALL JavaJSerialComm
——
虽然Java也提供串口编程的Java Communieafion
API开发包,但利用现成的VC++串口GPS类,设计
供Java访问的VC++DLL总比重新学习使用Java
Communication API开发包再设计Java串口GPS类要
简单的多,而且也做到了不同程序设计语言代码的
可重用性。
参考文献:
[1]苏德富,陈志琦,霍林.基于JNl的Java与其他高级语言之间通信
的研究与应用[J].广西大学学报:自然科学版,2OO5。3o(1):6—9.
任俊伟,林东岱.JNI技术实现跨平台开发的研究[J].计算机应
用研究,2OO5,22(7):180—184.
SetComm(JNIEnv*,jclass)
{
CGPSSerialComm Comm;
if(Comm.Init( COM1 ,CBR一1200,NOPAR.
ITY,7,ONESTDPBIT)!=TRUE)//初始化和设置
AfxMessageBox( 串口初始化失败I『『);
else
AfxMessageBox(”串口初始化成功!”);
return;
}
IEⅪ)oRT jint JNICALL Java—J ̄fiMComm—JS—
[3]
原佳丽,杨仁广,孟祥增.Java调用VC++的动态链接库[J].电
脑知识与技术,2007(7):169—170.
[4] 胡乃平,赵振.基于VC6.0串口通信动态链接库(DLL)的设计
与应用[J].微计算机信息,2OO7,23(3—3):214—216.
[5] 张永,李其申,李镍岚.基于VC++的动态链接库的创建与调用方
CGPSSerialComm Comm;
int i;
topWatch(JNIEnv*,jclass)
{
法[JJ.南昌航空工业学院学报:自然科学版,2OO6,19(3):81—84.
王敏,邵定宏,陆金桂.动态链接库技术及其应用实例[J].微计
算机信息,2OO6,22(9—3):272—274.
责任编辑:肖滨
i=Comm.StopWatch();/,停止检测串El
(上接第67页) [7]李俊生.一种图像平滑处理方法的空域算法与频域分析[J].江
苏:常州工学院学报,2004.
参考文献:
[1]朱秀昌,刘峰,胡栋.数字图像处理与图像通信[M].北京:北京
邮电大学出版社,2OO2:67一g4.
[8]冈萨雷斯.数字图像处理[M].北京:电子工业出版社,2004:132—
137.
[2]陈廷标,夏良正.数字图像处理[M].北京:人民邮电出版社,
1990:255—271.
[9] Kenneth R Cattlemen. tal image processing[M].E ewood Clifs,
. New Jersey,USA:Prentice Hall International,lnc.,1998.
[3]张晓黎,陆新华,吴冲龙.模板运算的传递函数分析[J].计算机
【10j Tsumoto S H.Extraction of knowledge from databases based OI1 RS
与现代化,2001(6):20—23.
[4]阮秋琦.数字图像处理[M].北京:电子工业出版社,2004.
[C J//Proceedings of IEEE Intenatrional Conference Oil Fuzzy Sys-
tems,New Orleans,Louisiana,USA.1996:748—754.
f5]商浩军,杜宇人.中值滤波在图像处理中的应用[J].电子工程
师.20o4(8):35—36.
[11] Ko Sung-Jea,Lee Yong Huon.Center we:ighted median filters and
their applications Oil image enhancementl cJ.IEEE Trnsaactions on
Ci,cuits and Systems,1991,38(9):984—993.
责任编辑:肖滨
[6]夏良正.数字图像处理【M].南京:东南大学出版社,1999:43—
83.
一
70一
发布评论