700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > 使用jna调用c语言动态库对接华视电子身份证阅读机

使用jna调用c语言动态库对接华视电子身份证阅读机

时间:2020-06-05 00:27:50

相关推荐

使用jna调用c语言动态库对接华视电子身份证阅读机

一些C语言的接口见上一篇文章

同样把用到的动态库放到jdk的bin目录文件夹下

Termb.java

import com.sun.jna.Library;import com.sun.jna.Native;public interface Termb extends Library {Termb instanceDll = (Termb) Native.loadLibrary("Termb",Termb.class);int CVR_InitComm(int Port);int CVR_Authenticate();int CVR_Read_Content(int active);int GetPeopleIDCode(byte[] strTmp, byte[] strLen);}

测试类:

import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.xvolks.jnative.JNative;import org.xvolks.jnative.Type;import org.xvolks.jnative.exceptions.NativeException;import org.xvolks.jnative.pointers.Pointer;import org.xvolks.jnative.pointers.memory.MemoryBlockFactory;import java.io.UnsupportedEncodingException;/*** @author: xiepanpan* @Date: /5/14* @Description:*/public class TestCVR {static Logger logger = LoggerFactory.getLogger(TestCVR.class);static String strTmp = "";public static void main(String[] args) {//1.打开端口try{int portReturnCode = Termb.instanceDll.CVR_InitComm(1001);System.out.println("打开端口返回值:" + String.valueOf(portReturnCode));if (portReturnCode!=1) {}}catch(Exception ex){logger.error("打开端口调用异常!"+ ex.getMessage());}try {System.out.println("请放置身份证。。。");Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}// 2. 认证int authReturnCode = 0;try{authReturnCode = Termb.instanceDll.CVR_Authenticate();System.out.println("认证返回值:" + String.valueOf(authReturnCode));if (authReturnCode!=1) {}}catch(Exception ex){logger.error("认证调用异常!"+ ex.getMessage());}//3. 读卡int readReturnCode = 0;try{readReturnCode = Termb.instanceDll.CVR_Read_Content(4);System.out.println("读卡返回值:" + String.valueOf(readReturnCode));if (authReturnCode!=1) {}}catch(Exception ex){logger.error("读卡调用异常!"+ ex.getMessage());}//4. 读取身份证号码int readIdReturnCode = 0;try{byte[] a = new byte[4*10];byte[] b = new byte[4*30];readIdReturnCode = Termb.instanceDll.GetPeopleIDCode(a,b);System.out.println("读取身份证号码返回值:" + String.valueOf(readIdReturnCode));if(readIdReturnCode == 1){System.out.println("身份号码读取成功:" + new String(a));}}catch(Exception ex){logger.error("调用异常!"+ ex.getMessage());}}}

那如果是web工程呢 有的小朋友说了我就不把动态库放到bin目录下边 能行么

答案是可以的 这里贴一下我的web工程的代码

目录结构:

接口Termb

import com.sun.jna.Library;import com.sun.jna.Native;import com.thunisoft.jy.ywgk.zf.utils.D5ScannerS77;/*** @author: xiepanpan* @Date: /5/14* @Description: 调用身份证读卡器的动态库*/public interface Termb extends Library {//绝对路径的地址获取,注意要去空格String filePath = Termb.class.getResource("").getPath().replaceFirst("/","").replaceAll("%20"," ")+"termb.dll";//先加载这两个dllUnPack UN_PACK = UnPack.instanceDll;Sdtapi SDTAPI = Sdtapi.instanceDll;Termb instanceDll = (Termb) Native.loadLibrary(filePath,Termb.class);/*** 初始化连接* @param Port* @return*/int CVR_InitComm(int Port);/*** 卡认证* @return*/int CVR_Authenticate();/*** 读卡操作* @param active* @return*/int CVR_Read_Content(int active);/*** 得到卡号信息* @param strTmp 返回的信息缓存指针* @param strLen 返回的信息长度指针* @return*/int GetPeopleIDCode(byte[] strTmp, byte[] strLen);}

接口Sdtapi

import com.sun.jna.Library;import com.sun.jna.Native;/*** @author: xiepanpan* @Date: /5/15* @Description: 安全模块通讯函数*/public interface Sdtapi extends Library {//绝对路径的地址获取,注意要去空格String filePath = Sdtapi.class.getResource("").getPath().replaceFirst("/","").replaceAll("%20"," ")+"sdtapi.dll";Sdtapi instanceDll = (Sdtapi) Native.loadLibrary(filePath,Sdtapi.class);}

接口UnPack

import com.sun.jna.Library;import com.sun.jna.Native;/*** @author: xiepanpan* @Date: /5/15* @Description: 身份证相片解码库*/public interface UnPack extends Library {//绝对路径的地址获取,注意要去空格String filePath = UnPack.class.getResource("").getPath().replaceFirst("/","").replaceAll("%20"," ")+"UnPack.dll";UnPack instanceDll = (UnPack) Native.loadLibrary(filePath,UnPack.class);}

关键代码:

//绝对路径的地址获取,注意要去空格String filePath = Termb.class.getResource("").getPath().replaceFirst("/","").replaceAll("%20"," ")+"termb.dll";//先加载这两个dllUnPack UN_PACK = UnPack.instanceDll;Sdtapi SDTAPI = Sdtapi.instanceDll;Termb instanceDll = (Termb) Native.loadLibrary(filePath,Termb.class);

一个接口对应一个dll文件

因为Termb.dll文件依赖UnPack.dll 和sdtapi.dll 因此加载Termb.dll 先加载

java与C语言 参数类型的映射关系:

出处:

/java-native-access/jna/edit/master/www/Mappings.md

参考博客:

/digdeep/p/5288215.html

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。