用JNA开发身份证阅读程序

本文介绍了如何利用Java Native Access (JNA) 框架开发身份证阅读程序,避免了使用JNI时需要额外编写C/C++适配DLL的复杂过程。JNA通过Java接口直接映射C数据类型,简化了与dll的交互。文中详细阐述了JNA的准备工作,包括下载JAR包,并展示了如何设置JNA查找dll的路径。此外,还提供了一个简单的JNA使用示例,调用msvcrt.dll中的printf函数。最后,通过示例代码解释了如何利用JNA来实现身份证阅读器,涉及sdtapi.dll和WltRs.dll库的方法,揭示了身份证阅读的基本步骤和接口用法。

    JNA(Java Native Access)是建立在JNI基础上的开源Java框架。
    项目网址: https://github.com/twall/jna
    使用JNI调用dll是比较麻烦的,如已有一个dll文件,还需要使用C语言另外编写一个dll(根据由java代码生成的C/C++ 头文件编写 ),使用者需要比较了解C/C++。

    使用JNA,不需再编写适配用的dll,只要编写一个 Java 接口和一些代码,作为dll的代理,就可在Java程序中调用dll,JNA自动实现Java和C的数据类型映射。

准备工作

     下载JAR包:jna.jar、platform.jar,一般使用只需jna.jar就可以了,platform.jar提供了许多工具类。

     JNA运行时会到path环境变量指定的路径下寻找dll库,用户也可以设置java 系统参数-Djna.library.path=...

JNA官网的一个简单例子

     使用C运行时库msvcrt.dll中的printf函数打印字符:

import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.Platform;

/**
 * Simple example of JNA interface mapping and usage.
 */
public class HelloWorld {

    // This is the standard, stable way of mapping, which supports extensive
    // customization and mapping of Java to native types.           

    public interface CLibrary extends Library {
        CLibrary INSTANCE = (CLibrary) Native.loadLibrary((Platform.isWindows() ? "msvcrt" : "c"), CLibrary.class);

        void printf(String format, Object... args);

    }

    public static void main(String[] args) {
        CLibrary.INSTANCE.printf("Hello, World\n");
        for (int i = 0; i < args.length; i++) {
            CLibrary.INSTANCE.printf("Argument %d: %s\n", i, args[i]);
        }
    }
}

使用JNA开发身份证阅读器

     用到的身份证阅读器基本类库:sdtapi.dll、WltRs.dll。以下为示例代码,其中列出了sdtapi.dll、WltRs.dll中提供的方法(方法名可以通过vc dumpbin等工具查看),介绍了阅读身份证的基本流程及接口的使用方法。

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.CharBuffer;
import java.util.HashMap;

import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.ptr.IntByReference;

public class IDCardReader {

    /**
     * sdtapi接口
     * <p>
     * 声明sdtapi.dll中的导出方法
     * <p>
     * 端口类api: SDT_OpenPort,SDT_ClosePort,SDT_GetCOMBaud,SDT_SetCOMBaud
     * SAM(身份证安全控制模块security account manager)类aip: SDT_GetSAMStatus,SDT_GetSAMID,SDT_GetSAMIDToStr,SDT_ResetSAM
     * 身份证卡类api: SDT_StartFindIDCard,SDT_SelectIDCard,SDT_ReadBaseMsg,SDT_ReadBaseMsgToFile,SDT_ReadNewAppMsg
     * <p>
     * 在普通开发中仅需使用部分端口类、身份证卡类api即可满足需要
     *
     * @author sunjc
     */
    public interface Sdtapi extends Library {
        Sdtapi INSTANCE = (Sdtapi) Native.loadLibrary("sdtapi", Sdtapi.class);

        /************************端口类API *************************/

        /**
         * 打开串口/USB口
         *
         * @param iPort 端口号
         *              1-16(十进制)为串口,1001-1016(十进制)为USB口
         * @return
         */
        int SDT_OpenPort(int iPort);

        /**
         * 关闭串口/USB口
         *
         * @param iPort 端口号
         * @return
         */
        int SDT_ClosePort(int iPort);

        /**
         * 查看串口波特率
         *
         * @param iPort       串口号 (1-16)
         * @param pucBaudRate 串口波特率
         * @return
         */
        int SD
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值