使用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: 2020/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: 2020/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: 2020/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: 2020/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语言 参数类型的映射关系:
出处:
https://github.com/java-native-access/jna/edit/master/www/Mappings.md
参考博客:
https://www.cnblogs.com/digdeep/p/5288215.html
使用jna调用c语言动态库对接华视电子身份证阅读机相关推荐
- 使用jnative调用c语言动态库对接华视电子身份证阅读机
一 身份证阅读器SDK使用手册 1. 定义 应用函数开发包含下列文件: termb.dll API函数的动态联接库 sdtapi.dll 安全模块通讯函数 UnPack.dll 身份证相片解码库 适用 ...
- vue调用华视电子身份证阅读器cvr-100uc
1.去官网下载安装包服务下载_华视电子 解压后点击 安装后找到网页版开发包 点击华视电子读卡器安装,安装后点击读卡服务 安装USB插件. 2.新建reader.js文件,阅读器默认端口19196 3. ...
- Rust应用调用C语言动态库
外部功能接口FFI 虽然高级(脚本)编程语言的功能丰富,表达能力强,但对底层的一些特殊操作的支持并不完善,就需要以其他编程语言来实现.调用其他编程语言的接口,被称为Foreign Function I ...
- go语言调用c语言动态库及交叉编译
实现基础:CGO编程 C/C++经过几十年的发展,已经积累了庞大的软件资产,它们很多久经考验而且性能已经足够优化.Go语言必须能够站在C/C++这个巨人的肩膀之上,有了海量的C/C++软件资产兜底之后 ...
- java调用c语言_Java调用C语言动态库(JNA方式,持续)
过程主要分为以下几个步骤: 1.vs2017编写cpp/h代码,编译成dll,编译成功后,用depends查看库的依赖是否有缺失,也可以自己写个demo,调用这个dll中的函数,是否可以调用成功作为验 ...
- Java调用C语言动态库
过程主要分为以下几个步骤: 1.vs2017编写cpp/h代码,编译成dll,编译成功后,用depends查看库的依赖是否有缺失,也可以自己写个demo,调用这个dll中的函数,是否可以调用成功作为验 ...
- c语言怎么调用sdl库函数,Go调用SDL2的C语言动态库
# Go调用SDL2的C语言动态库 在网上找到go的GUI项目基本都需要安装额外软件库,尝试了一下使用go调用dll库的,有所收获,抛砖引玉,留个记录怕以后忘了. ## 1.目录结构 ``` └─li ...
- JAVA如何调用C/C++动态库
一.调用方式: JAVA调用C/C++动态库有很多方法,常用的有JNI(Java Native Interface).JNA(Java Native Access). JNI:早在JAVA1.1版本就 ...
- C# VC6调用VC6的动态库DLL
C# VC6调用VC6的动态库DLL 一 VC创建动态库 1. DLL的创建 启动VC6.0, 新建一个"Win32 Dynamic-Link Library"工程,选择" ...
最新文章
- 随机加解密java_JAVA随机数生成 Math.random和java.util.Random使用简介
- sql-bench mysql_MySQL性能测试(一)——RHEL 7.1, MySQL 5.6.25, sql-bench
- iOS interface适配
- web报表工具FineReport使用中遇到的常见报错及解决办法(二)
- 几组图片轮回html,HTML 5 Canvas
- 广义线性模型(Generalized Linear Models, GLM)
- Enviropro EP100D-08管式土壤水分探针
- [转]如何在NIOS II中读写EPCS剩余空间
- 火箭08-09赛程列表
- 郭涛 黄渤 田原09贺岁大片《高兴》DVD修正版
- 安卓Android与H5双向交互MathJax展示数学公式(源码+解析)
- 基于SSM的汽车维修管理软件设计与实现
- vue.js的两个核心是什么
- ctfshow-web78(文件包含)
- android tabhost 分割线,FragmentTabHost使用方法详解
- 宽带拨号任何使用计算机,宽带拨号密码怎么查看【图解】
- usb high speed chirp
- 《华为研发》 张利华
- 解决Pycharm安装库出现Installing Packages Failed错误
- ylinux系统找到软件_linux系统如何安装软件 (详细文字教程)