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

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

}

 

  • 1
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值