由于项目需要进行读卡操作,需要使用java进行读取dll文件
设备:德卡T10
1. 引入POM文件
<dependency>
<groupId>net.java.dev.jna</groupId>
<artifactId>jna</artifactId>
<version>5.6.0</version>
</dependency>

2.写入接口

import com.sun.jna.Library;import com.sun.jna.Native;
import com.sun.jna.NativeLong; public interface WINAPI extends Library{ WINAPI INSTANCE = Native.loadLibrary("SSCard",WINAPI.class);
//初始化
NativeLong Init(String s1, String s2);
//读取社保卡
NativeLong ReadCardBas(byte[] s1,int s2,byte[] s3,int s4);
//校验PIN码
NativeLong VerifyPIN(byte[] s1,int s2);
//修改PIN码
NativeLong ChangePIN(byte[] s1,int s2);
//读身份证信息
NativeLong ReadSFZ(byte[] s1,int s2,byte[] s3,int s4);
//读取二维码信息
NativeLong GetQRBase(int s0,byte[] s1,int s2,byte[] s3,int s4);
//校验医保密码
NativeLong VerifyYBPZPass(byte[] s1,int s2);
//修改医保密码
NativeLong ChangeYBPZPass(byte[] s1,byte[] s2,byte[] s3,byte[] s4,byte[] s5);
}

3.写对应的方法类
PS:
1.byte[]不是传入参数,而是返回参数,进行字节转字符串后才能获取对应的参数
2.由于德卡为了匹配大多数电脑,必须使用32位JDK才能读取成功,否则报错找不到dll文件路径
3.解码类型为GBK

德卡T10文档参照附件

import com.sun.jna.NativeLong;
import io.renren.modules.back.service.WINAPI;
import org.springframework.stereotype.Component;
import java.io.UnsupportedEncodingException; @Component
public class DKUtil {
public static String pUrl="http://10.126.105.66/hsa-hgs-adapt/api/card/initDll"; private static String test() throws UnsupportedEncodingException {
//jna linux相对路径调用c/c++接口时候,名称必须是lib开头,且第一个参数是lib后面的名称,如libtest.so,加载时候应该使用test来加载
//jna win相对路径调用c/c++接口时候,直接名称不加后缀调用,如test.dll,加载时候应该使用test来加载
//jna linux绝对路径调用c/c++接口时候,完整路径加上后缀,如test.so,加载时候应该使用/opt/test.so来加载
//jna win相对路径调用c/c++接口时候,完整路径可以不接后缀,如test.dll,加载时候应该使用D:\\test来加载
// Test lib = (Test) Native.loadLibrary("test_64", Test.class);
//Test lib = Native.loadLibrary(path, Test.class);
// 例1 NativeLong nativeLong = WINAPI.INSTANCE.Init(pUrl, "620100");
System.out.println("11111" + nativeLong);
byte[] chars1 = new byte[4096];
byte[] chars2 = new byte[4096];
NativeLong nativeLong1 = WINAPI.INSTANCE.ReadSFZ(chars1, 4096, chars2, 4096);
String result;
System.out.println("22222222:" + nativeLong1);
result = new String(chars1, "GBK");
result = result + "|" + new String(chars2, "GBK");
System.out.println(result);
return result;
} /**
* 初始化
* @returnR
*/
public static R init() {
NativeLong nativeLong= WINAPI.INSTANCE.Init(pUrl,"620100");
if (!"1".equals(nativeLong)){
return R.ok().put("msg","初始化成功");
}else {
return R.error().put("msg","初始化失败");
}
} /**
* 读取身份证信息
* @return
*/
public static R getSFZ() throws UnsupportedEncodingException {
R r=init();
if (!"0".equals(r.get("code").toString())){
return r;
}
byte[] chars1 = new byte[4096];
byte[] chars2 = new byte[4096];
NativeLong nativeLong=WINAPI.INSTANCE.ReadSFZ(chars1,4096,chars2,4096);
String result;
if ("0".equals(nativeLong.toString())){
result=new String(chars1,"GBK");
result=result+"|"+new String(chars2,"GBK");
System.out.println(result);
return R.ok().put("msg",result);
}else {
result=new String(chars1,"GBK");
result=result+"|"+new String(chars2,"GBK");
System.out.println(result);
return R.error().put("msg",result);
}
} /**
* 读取社保卡信息
* @return
*/
public static R getYBCard() throws UnsupportedEncodingException {
init(); byte[] chars1 = new byte[4096];
byte[] chars2 = new byte[4096];
NativeLong nativeLong=WINAPI.INSTANCE.ReadCardBas(chars1,4096,chars2,4096);
String result;
if ("1".equals(nativeLong)){
result=new String(chars1,"GBK");
result=result+"|"+new String(chars2,"GBK");
return R.ok().put("msg",result);
}else {
result=new String(chars1,"GBK");
result=result+"|"+new String(chars2,"GBK");
return R.error().put("msg",result);
}
} /**
* 读取二维码
* @return
*/
public static R getQRBase() throws UnsupportedEncodingException {
init(); byte[] chars1 = new byte[1024];
byte[] chars2 = new byte[1024];
NativeLong nativeLong=WINAPI.INSTANCE.GetQRBase(100,chars1,4096,chars2,4096);
String result;
if ("1".equals(nativeLong)){
result=new String(chars1,"GBK");
return R.ok().put("Content",result);
}else {
result=new String(chars1,"GBK");
return R.error().put("Content",result);
}
} public static void main(String[] args) throws UnsupportedEncodingException {
System.out.println(getSFZ());
}
}

使用JNA读取dll文件的更多相关文章

  1. C#读取DLL文件获取所有类

    说明 调用Web.dll 文件,获取其中的所有的WebService 参考 https://blog.csdn.net/huoliya12/article/details/78873123 流程 使用 ...

  2. C++读取dll文件所在目录

    ////保证config.txt从本DLL目录位置读取 //获取DLL自身所在路径(此处包括DLL文件名) }; GetModuleFileNameA((HINSTANCE)&__ImageB ...

  3. dll文件32位64位检测工具以及Windows文件夹SysWow64的坑

    自从操作系统升级到64位以后,就要不断的需要面对32位.64位的问题.相信有很多人并不是很清楚32位程序与64位程序的区别,以及Program Files (x86),Program Files的区别 ...

  4. C# 读取EXCEL文件的三种经典方法

    1.方法一:采用OleDB读取EXCEL文件: 把EXCEL文件当做一个数据源来进行数据的读取操作,实例如下: public DataSet ExcelToDS(string Path) { stri ...

  5. 自己动手写中文分词解析器完整教程,并对出现的问题进行探讨和解决(附完整c#代码和相关dll文件、txt文件下载)

    中文分词插件很多,当然都有各自的优缺点,近日刚接触自然语言处理这方面的,初步体验中文分词. 首先感谢harry.guo楼主提供的学习资源,博文链接http://www.cnblogs.com/harr ...

  6. C#生成PDF文档,读取TXT文件内容

    using System.IO;using iTextSharp.text;using iTextSharp.text.pdf; //需要在项目里引用ICSharpCode.SharpZipLib.d ...

  7. 使用jna调用dll,jdk位数和dll位数的关系

    最近在学习jna,发现dll文件能能否成功调用取决于jdk位数. 32位jdk只能使用32位的dll,64位jdk只能使用64位的dll,否则位数不对应的话报的错是 "Exception i ...

  8. C# 动态修改dll的签名 以及修改引用该dll文件的签名

    在读取RedisSessionStateProvider配置 提到用mono ceil 来修改程序集以及它的签名,里面GetPublicKey 和GetPubliKeyToken 方法里面那个字符串的 ...

  9. C# 读取压缩文件方式及乱码处理

    目前主流的压缩文件操作类,除了C#原生的.还有 1. ZIP-DotNetZip 网址:http://dotnetzip.codeplex.com/ 2 7Zip-SevenZipSharp 网址:h ...

  10. C/C++ 关于生成静态库(lib)/动态库(dll)文件如何使用(基于windows基础篇)

    1. 首先,如何制作一个静态库(lib)? 额, 对于静态库,我们知道,里头是不应该有Main函数,它只是一个配合文件.之所以称之为lib静态库,其实就是指,我们需要用到lib里头的函数时,我们才会去 ...

随机推荐

  1. Java IO流 - 字节流的使用详细介绍

    IO流的基本介绍: IO流的概述: i 表示intput,是数据从硬盘文件读入到内存的过程,称之输入,负责读. o 表示output,是内存程序的数据从内存到写出到硬盘文件的过程,称之输出,负责写. ...

  2. Hive安装与启动

    一.mysql安装 在配置Hive之前一般都需要安装和配置MySQL,因为Hive为了能操作HDFS上的数据集,那么他需要知道数据的切分格式,如行列分隔符,存储类型,是否压缩,数据的存储地址等信息. ...

  3. 从javascript代码解析过程理解执行上下文与作用域提升

    javascript代码解析过程 执行上下文和作用域是javascript中非常重要的部分,要弄清楚它们首先就要说到javascript的运行机制,javascript代码被解析经过了以下几个步骤 P ...

  4. 对JavaScript中与字符串相关的方法总结

    JavaScript中的字符串是由16位码元code unit组成.通常来说,一个字符=16位码元,该类字符也叫做单码元字符.还有一种字符组成策略是代理对,它由两对16位码元组成,即一个字符对应两个1 ...

  5. 【opencv】传统图像识别:hog+svm行人识别实战

    实战工具:python3.7+pycharm+opencv4.6算法知识:HOG特征提取.SVM模型构建实战目的:本次实战的目的是熟悉HOG+SVM工作流算法,初步掌握图像分类的传统算法.实战记录:本 ...

  6. 优化 Redis 集群缓存分配:解决节点间分配不均导致内存溢出问题

    一.Redis 集群部署简介 在现代应用程序中,缓存被广泛应用以提高性能和减轻后端数据库的压力.本文将探讨面对 Redis 集群缓存分配不均问题时的解决方法. 我们的 Redis 集群部署包括 3 主 ...

  7. C#程序变量统一管理例子 - 开源研究系列文章

    今天讲讲关于C#应用程序中使用到的变量的统一管理的代码例子. 我们知道,在C#里使用变量,除了private私有变量外,程序中使用到的公共变量就需要进行统一的存放和管理.这里笔者使用到的公共变量管理库 ...

  8. Windows校验文件MD5和SHA值的方法

    1.需求背景 下载或传输文件后,需要计算文件的MD5.SHA256等校验值,以确保下载或传输后的文件和源文件一致 2.校验方法 如上图所示,可以使用Windows自带的certutil命令来计算一个文 ...

  9. 【SQL】所谓的连表查询

    连表查询 外连接 外连接分为两种,左(外)连接和右(外)连接 基本语法如下: SELECT 字段列表 FROM 表1 LEFT JOIN 表2 ON 条件; 这是左连接,因此以表1中的 [字段列表] ...

  10. 《SQL与数据库基础》10. 存储引擎

    目录 存储引擎 MySQL体系结构 存储引擎简介 三种经典存储引擎 InnoDB 逻辑存储结构 MyISAM Memory 区别及特点 存储引擎选择 本文以 MySQL 为例 存储引擎 MySQL体系 ...