如何利用JNA框架实现与读写器的通信
如何利用JNA框架实现与读写器的通信
目前市场上的大多硬件厂商提供的开发包是原生函数,比如读写设备就是这个情况,一般设备厂商会提供两种类型的类库文件,windows系统的会包含.dll/.h/.lib文件,而linux会包含.so/.a文件,这里只讨论windows系统下的c/c++编译的dll文件调用方法。
现在来讨论这样一个问题,我们现要为JAVA项目添加IC卡读写器功能,设备厂商提供了一个fkc60.dll动态库,下面以其中的二个函数为例:
1. 打开串口函数
1) bool USB_DevInit(int port);
2) 用途及说明:调用其它函数前先打开串口,成功返回true,失败返回false;
3) 参数:port表示串行口,1为端口1,2为端口2,以此类推。
2. 控制读写器发声函数
1) bool USB_BeepEx(int port, int ptype);
2) 用途及说明:控制读写器发声;成功返回true,失败返回false;
3) 参数:port表示串口号,1为端口1,2为端口2,以此类推,ptype表示发声类型0发短声,1发长声。
首先,你需要下载一个jna.jar 包,就可以使用方便地调用动态链接库中的C函数了,在JAVA项目中引入jna.jar包,本例是把fkc60放在项目的lib目录下引入的。
其次,你需要创建一个类:
import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.Platform;
public interface CLibrary extends Library {
//当前路径是在项目下,而不是bin输出目录下。
//fkc60为需要调用的dll文件,不加后缀有利于平台无关性
CLibrary sdtapi = (CLibrary) Native.loadLibrary(
(Platform.isWindows() ? .\\lib\\fkc60" : "c"), CLibrary.class);
//======================以下是构造dll发布的函数================//
//打开串口函数
boolean USB_DevInit(int port);
//寻卡函数
int USB_Request(int tagType);
//控制读写器发声的函数,port表示串口号,1为端口1,2为端口2
//ptype表示发声类型0发短声,1发长声。
boolean USB_BeepEx(int port,int ptype);
//关闭串口函数
boolean USB_DevClose();
}
public class test {
/**
* 以下是调用测试函数
*/
public static void main(String[] args) {
try {
//构造一个调用对象,打开串口函数
boolean result = CLibrary.sdtapi.USB_DevInit(2);
System.out.println("result:"+result);
//构造一个调用对象,打开串口函数
int requestData=CLibrary.sdtapi.USB_Request(1);
System.out.println("request:"+requestData);
//构造一个调用对象,打开串口函数,成功发声返回true
boolean Beep=CLibrary.sdtapi.USB_BeepEx(5, 0);
System.out.println("Beep:"+ Beep);
} catch (Exception e) {
e.printStackTrace();
}
}
}
最后执行可以看到控制台中打印串行口打开成功信息,并听到读写器发出了短声。