java调用第三方dll心得 联系客服

发布时间 : 星期二 文章java调用第三方dll心得更新完毕开始阅读5264e7f7f61fb7360b4c65a3

最近在开发j2ee的项目中,需要读取面部识别考勤终端机中的数据,厂商提供二次开发需要的就是一个开发指南说明书和2个dll文件:HwDevComm.dll、HDCP_Utils.dll。其中重要的就是HwDevComm.dll。 用到的函数有3个: 1、 执行各种命令

int HwDev_Execute( char * pDevInfoBuf, unsigned long nDevInfoLen,

char * pSendBuf, unsigned long nSendLen, char ** pRecvBuf, unsigned long * pRecvLen, FuncTotalDoneTp pFuncTotalDone) 2、 释放存放返回数据的内存

void HwDev_Finish(char **pRecvBuf)

3、 服务器端启动或者关闭对特定端口的监听服务,用来接收考勤机主动上传的信息

int HwDev_Server(int nSwith, char *pServerInfoBuf,

unsigned long nServerInfoLen,

FuncProcessData pFuncProcessData)

Java是使用jni来调用本地dll文件的

通过上网查找和自己的摸索,现就自己在开发过程中遇到的问题和解决方法总结如下(下面仅以HwDev_Execute 方法的实现为例): 开发环境:

我的开发环境是:操作系统:window7 开发语言:java、vc++ java开发环境:myeclipse6.0、jdk1.6 vc++开发环境:visual studio 2008 第一步:java中的准备工作

1、 在myeclipse中创建一个java项目,新建一个类Face,

如下图所示:

这个类可以看作是对上面的3个方法的封装类。具体的实现如下所示:

public class Face { static {

// 装载库文件face.dll,不包括库文件的扩展名

// face.dll必须是在java.library.path这一jvm变量所指向的路径下, //该路径可以通过System.getProperty(\来获得

System.loadLibrary(\);

}

private native String HwDev_Execute(String sDevInfoBuf, long lDevInfoLen, String sSendBuf, long lSendLen, String[] spRecvBuf, long[] lpRecvLen);

//对外接口

public String HwDev_Execute_temp(String sDevInfoBuf, long

lDevInfoLen, String sSendBuf, long lSendLen, String[] spRecvBuf, long[] lpRecvLen) {

return this.HwDev_Execute(sDevInfoBuf, lDevInfoLen, sSendBuf, lSendLen, spRecvBuf, lpRecvLen); } }

说明:java中使用System.loadLibrary(\)来装载本地库文件,我们将要在下面步骤中生成face.dll文件,java就是通过调用生成的face.dll文件来获得考勤机上的数据。

用native修饰的方法是本地方法,java中不提供方法的实现。

2、 用javac编译生成class文件(如果是用myeclipse等IDE开发就会自动编译生成class文件),再用javah命令生成.h的头文件。具体的执行如下(在cmd下):

javac Face.java javah Face

此时,就会在class文件的路径下生成名为Face.h的头文件,头文件的内容如下所示: /* DO NOT EDIT THIS FILE - it is machine generated */ #include

/* Header for class Face */

#ifndef _Included_Face #define _Included_Face #ifdef __cplusplus extern \#endif /*

* Class: Face

* Method: HwDev_Execute *

/lang/String; */

JNIEXPORT jstring JNICALL Java_Face_HwDev_1Execute

(JNIEnv *, jobject, jstring, jlong, jstring, jlong, jobjectArray, jlongArray);

Signature:

(Ljava/lang/String;JLjava/lang/String;J[Ljava/lang/String;[J)Ljava

#ifdef __cplusplus } #endif #endif

第二步:vc++的准备工作

1、 打开visual Studio 2008,新建一个项目,选择Win32—>win32项目,项目名称为:face。

如下图所示:

点击确定,然后点击下一步,进入应用程序设置的页面,如下图所示:

在应用程序类型下选择”DLL”,在附加选项中选中”导出符号”,点击完成。 生成的项目的目录结构如下图所示:

2、 将Face.h中的内容复制到vc++项目的face.h的中。在face.h 的头文件中包含了jni.h头

文件,所以需要将jdk安装目录下include文件夹下的jni.h头文件和include\\win32文件夹下的jawt_md.h和jni_md.h头文件拷贝到visual studio的安装目录下vc\\include文件夹下。我的路径是:C:\\Program Files\\Microsoft Visual Studio 9.0\\VC\\include

也可以把jdk下的那三个头文件拷贝到vc++的项目目录下,我的项目目录路径是: C:\\Users\\wangzw\\Documents\\Visual Studio 2008\\Projects\\face\\face,如果是拷贝到了项目的路径下的话,就需要将face.h头文件中的#include 改为#include “jni.h”