美文网首页
JNA调用DLL学习笔记

JNA调用DLL学习笔记

作者: 德普先森 | 来源:发表于2019-06-16 13:11 被阅读0次

    学习背景:

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

          本文链接:https://www.haomeiwen.com/subject/blnwfctx.html