JNA调用DLL学习笔记

学习背景:

    对接电子口岸,需要对传输的报文信息进行数据加签,他们提供了硬件加签的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);

}

你可能感兴趣的:(JNA调用DLL学习笔记)