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

本文介绍了如何利用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库的方法,揭示了身份证阅读的基本步骤和接口用法。
4155

被折叠的 条评论
为什么被折叠?



