C ++中指针 void**、void*、char**、char*、int* 对应JAVA JNA类型映射关系及简单示例

    xiaoxiao2022-07-06  259

               在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; } }

     

    最新回复(0)