在JNA中模拟指针,最常用到的就是Pointer类和PointerByReference类。Pointer类代表指向任何东西的指针,PointerByReference类表示指向指针的指针。Pointer类更加通用,事实上PointerByReference类内部也持有Pointer类的实例。
以指纹仪C++接口为例:
C1、 检测设备类型,
1、函数名称:FPIDevDetect
2、功能说明:检测设备类型,返回设备类型编号
3、函数返回:0:USB设备 1—8:串口设备,串口号。
int FPIDevDetect (void);
C2、 采集指纹特征命令(FPIGetFeature)
1、函数名称:FPIGetFeature
2、功能说明:采集指纹图像,生成指纹特征值,并上传。
3、入口参数:nPort:设备类型(0:USB 1~8:串口)
4、出口参数:
pVerBuf:指纹特征
pnVerLen:指纹模板长度(数据为0x30--0x3F之间可见字符或BASE64字节, 512字节)
pszErrMsg:错误信息(<=64字节)
int FPIGetFeature(int nPort, char* pVerBuf, int *pnVerLen, char * pszErrMsg);
C3、 获取指纹数据(FPIGetFingerInfo)
1、函数名称:FPIGetFingerInfo
2、功能说明:调用FPIGetTemplate或FPIGetFeature之后,可通过调用该接口传出指纹模板/特征数据。
3、返回值:指纹数据(数据为0x30--0x3F之间可见字符或BASE64字节, 512字节)
char* FPIGetFingerInfo (void);
C4、 指纹比对算法(FPIFpMatch)
1、函数名称:FPFpIMatch;
2、功能说明:根据传入的指纹模板数据和指纹特征数据,进行指纹相似度验证。
3、入口参数:
psRegBuf:指纹模板数据
psVerBuf:指纹特征数据
nLevel:比对安全级别(指纹比对级别为1到5,一般设其为3)
4、出口参数:无
5、返回值:0:成功 <0:失败
int FPIFpMatch (char *psRegBuf, char *psVerBuf, int nLevel);
JAVA 对应接口定义与实现
import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.Pointer;
import com.sun.jna.ptr.IntByReference;
public interface FingerPrintService extends Library {
FingerPrintService INSTANCE = (FingerPrintService) Native.loadLibrary("C:\\Windows\\System32\\libFPDev_WL.dll", FingerPrintService.class);
/**
*
* @return 0:USB设备 1—8:串口设备,串口号。
* 备注 初始化指纹仪
*/
int FPIDevDetect();
/**
*
* @param port 设备号
* @param pVerBuf 指纹特征
* @param pnVerLen 指纹长度
* @param pszErrMsg 错误信息
* @return
* 备注
*/
int FPIGetFeature(int port, Pointer pVerBuf, IntByReference pnVerLen, Pointer pszErrMsg);
/**
*
* @return 数据为0x30--0x3F之间可见字符或BASE64字节, 512字节
* 备注 获取指纹数据
* 调用FPIGetTemplate或FPIGetFeature之后,可通过调用该接口传出指纹模板/特征数据。
*/
String FPIGetFingerInfo();
/**
*
* @param psRegBuf 指纹模板数据
* @param psVerBuf 指纹特征数据
* @param nLevel 比对安全级别(指纹比对级别为1到5,一般设其为3)
* @return
* 备注
* 0:成功 <0:失败
*/
int FPIFpMatch(String psRegBuf,String psVerBuf,int nLevel);
}
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.HashMap;
import java.util.Map;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import com.sun.jna.Memory;
import com.sun.jna.Pointer;
import com.sun.jna.ptr.IntByReference;
import com.zfsoft.netty.service.FingerPrintService;
public class FingerPrintUtil {
public static final String DRIVER = "com.mysql.jdbc.Driver";
public static final String URL = "jdbc:mysql://xxxxxx:3306/xxxxx?createDatabaseIfNotExist=true&useUnicode=true&characterEncoding=utf-8&useSSL=false";
public static final String USERNAME = "xxxx";
public static final String PASSWORD = "xxxx";
private static final Logger logger = LogManager.getLogger(FingerPrintUtil.class);
public static Connection jdbcUtil() {
String driver = DRIVER;
String url = URL;
String username = USERNAME;
String password = PASSWORD;
Connection conn = null;
try {
Class.forName(driver);
conn = (Connection) DriverManager.getConnection(url, username, password);
} catch (Exception e) {
logger.info("数据库连接异常"+e.getMessage());
}
return conn;
}
/*
* 指纹比对
*
*/
public static Map<String, Object> FingerCompare() {
logger.info("进入指纹对比");
String sql = "select * from t_sys_user where IS_ABLE = 'Y' and IS_DELETE = 'N' and FINGERPRINT is not null";
//获取指纹
Map<String, Object> fingerMap = FingerPrintUtil.getFinger();
// 初始化
try {
//连接数据库
Connection conn = jdbcUtil();
logger.info("数据库连接对象...{}msg==="+conn);
PreparedStatement prepareStatement = conn.prepareStatement(sql);
ResultSet rs = prepareStatement.executeQuery();
String fingerprint = (String) fingerMap.get("fingerData");
rs.last();//移到最后一行
int rowCount = rs.getRow();
rs.beforeFirst();//移到初始位置
logger.info("数据库记录数...{}msg==="+rowCount);
int j = 0;
while(rs.next()){
String userFinger = rs.getString(20);
//指纹对比方法
int success = FingerPrintService.INSTANCE.FPIFpMatch(userFinger, fingerprint, 3);
logger.info("指纹对比结果...{}msg==="+success);
//比对成功结果为0
if(success == 0){
fingerMap.put("code", "200");
fingerMap.put("fingerData",fingerprint);
break;
}else{
j++;
if(j == (rowCount-1)){
fingerMap.put("code", "400");
fingerMap.put("msg", "未查询到数据库指纹信息...");
break;
}
}
}
conn.close();
prepareStatement.close();
rs.close();
} catch (Exception e) {
e.printStackTrace();
}
return fingerMap;
}
/**
* 指纹读取
* @return
*/
public static Map<String, Object> getFinger() {
logger.info("进入读取指纹");
Map<String,Object> fingerMap = new HashMap<>();
// 初始化
int port = FingerPrintService.INSTANCE.FPIDevDetect();
logger.error("指纹仪端口初始化...{}MSG===="+port);
if(port!=0){
logger.error("指纹仪初始化失败");
fingerMap.put("code", "400");
fingerMap.put("msg", "指纹仪初始化失败...");
}
Pointer pVerBuf = new Memory(1024);
IntByReference length = new IntByReference();
Pointer errorMessage = new Memory(1024);
// 获取指纹
int fpiGetFeature = FingerPrintService.INSTANCE.FPIGetFeature(port, pVerBuf, length, errorMessage);
logger.info("获取的到的指纹特征是"+fpiGetFeature);
// 拿到指纹
String fpiGetFingerInfo = FingerPrintService.INSTANCE.FPIGetFingerInfo();
logger.info("获取到的指纹码是:"+fpiGetFingerInfo);
if (!fpiGetFingerInfo.isEmpty()) {
fingerMap.put("code", "200");
fingerMap.put("fingerData",fpiGetFingerInfo);
}else{
fingerMap.put("code", "400");
fingerMap.put("msg", "获取指纹码失败...");
}
return fingerMap;
}
}