学习背景:
对接电子口岸,需要对传输的报文信息进行数据加签,他们提供了硬件加签的USBKey。电子口岸安全组件是以DLL的方式提供,并同时支持32位、64位操作系统,分别对应2个不用版本的Sign64.dll文件。
对于没有接触过DLL文件的我来说,问题就来了:
1、什么是DLL文件?
2、Java怎么调用DLL文件的?
1、什么是DLL文件?
来源「百度百科」的解释:
DLL(Dynamic Link Library)文件为动态链接库文件,又称“应用程序拓展”,是软件文件类型。在Windows中,许多应用程序并不是一个完整的可执行文件,它们被分割成一些相对独立的动态链接库,即DLL文件,放置于系统中。当我们执行某一个程序时,相应的DLL文件就会被调用。一个应用程序可使用多个DLL文件,一个DLL文件也可能被不同的应用程序使用,这样的DLL文件被称为共享DLL文件。
其意义:
DLL文件中存放的是各类程序的函数(子过程)实现过程,当程序需要调用函数时需要先载入DLL,然后取得函数的地址,最后进行调用。使用DLL文件的好处是程序不需要在运行之初加载所有代码,只有在程序需要某个函数的时候才从DLL中取出。另外,使用DLL文件还可以减小程序的体积。
2、java怎么调用DLL文件?
JNA
什么是JNA?
来源「百度百科」的解释:
JNA(Java Native Access )提供一组Java工具类用于在运行期间动态访问系统本地库(native library:如Window的dll)而不需要编写任何Native/JNI代码。开发人员只要在一个java接口中描述目标native library的函数与结构,JNA将自动实现Java接口到native function的映射。
优点:
JNA可以让你像调用一般java方法一样直接调用本地方法。就和直接执行本地方法差不多,而且调用本地方法还不用额外的其他处理或者配置什么的,也不需要多余的引用或者编码,使用很方便。
3、案例分享
电子口岸的文档
取卡号
函数原型:UINT GetCardID(BYTE* szCardID, UINT* nCardIDLen)
使用前提:extern "C" _declspec(dllimport) UINT GetCardID(BYTE* szCardID, UINT* nCardIDLen)
功能简介:取卡号,卡号至少分配100字节
参数说明:【out】szCardID 卡号,以\0结束
【in,out】nCardIDLen 卡号长度(该参数输入时不能等于0,必须是szCardID实际开辟的空间大小)
返回值说明:0取卡号成功;-1卡初始化错;-2取卡号失败
代码示例:
public interface CLibraryextends Library {
CLibraryINSTANCE = Native.loadLibrary("Sign64", CLibrary.class);
/**
* 取卡号
* UINT GetCardID(BYTE* szCardID, UINT* nCardIDLen)
*
* @param szCardID
* 卡号,以\0结束
* @param nCardIDLen
* 卡号长度(该参数输入时不能等于0,必须是szCardID实际开辟的空间大小)
* @return 0 取卡号成功 -1 卡初始化错 -2 取卡号失败
*
*/
int GetCardID(Memory szCardID, IntByReference nCardIDLen);
/**
* 取证书号
* UINT GetCertNo(BYTE* szCertNo, UINT* nCertNoLen)
*
* @param szCertNo
* 证书号,以\0结束
* @param nCardIDLen
* 证书号长度(该参数输入时不能等于0,必须是szCertNo实际开辟的空间大小)
* @return 0 取证书号成功 -1 卡初始化错 -2 取证书号失败
*
*/
int GetCertNo(Memory szCertNo, IntByReference nCardIDLen);
/**签名
* UINT Sign(BYTE *src, UINT srcLen, BYTE *sign, UINT* signLen, const
* char * pwd)
*
* @param src
* 待签名的原始数据
* @param srcLen
* 待签名的原始数据的长度
* @param sign
* 签名数据,至少分配128字节
* @param signLen
* 签名数据长度,应大于128个字节,输入时应等于szSignData实际分配的空间大小
* @param pwd
* 进行加签的卡密码
* @return 0 签名成功 -1 卡初始化错 -2 卡口令不正确 -3 签名失败 -4 PEM编码失败
*
*/
int Sign(String src, int srcLen, Memory sign, IntByReference signLen, String pwd);
}
网友评论