一,JNative方法
JNAjar包依赖:
<dependency>
<groupId>net.java.dev.jna</groupId>
<artifactId>jna</artifactId>
<version>3.1.0</version
</dependency>
注意事项:
- 尝试了引入JNative的jar包来实现(由于jar自从2013年就停止更新了,所以该jar包只适用于jdk版本为32位的1.6以下版本。(包括1.6))把.dll文件放置在项目的跟目录下。有可能会报找不到.dll文件可以再尝试把项目放入系统盘如:C:\Windows\System32。相关代码如下
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println("-------------CVR_InitComm=");
String strTmp = "";
int len = 0;
try {
JNative n = null;
n = new JNative("Termb.dll", "CVR_InitComm");
n.setRetVal(org.xvolks.jnative.Type.INT); // 指定返回参数的类型
n.setParameter(0, 1001);
n.invoke(); // 调用方法
JNative n2 = null;
n2 = new JNative("Termb.dll", "CVR_Authenticate");
n2.setRetVal(org.xvolks.jnative.Type.INT); // 指定返回参数的类型
n2.invoke(); // 调用方法
// return Integer.parseInt(n.getRetVal());
System.out.println("-------------CVR_InitComm="
+ Integer.parseInt(n.getRetVal()));
System.out.println("-------------CVR_InitComm="
+ Integer.parseInt(n2.getRetVal()));
if (Integer.parseInt(n2.getRetVal()) == 1) {
JNative n3 = null;
n3 = new JNative("Termb.dll", "CVR_Read_Content");
n3.setRetVal(org.xvolks.jnative.Type.INT); // 指定返回参数的类型
n3.setParameter(0, "");
n3.invoke(); // 调用方法
System.out.println("-------------CVR_InitComm="
+ Integer.parseInt(n3.getRetVal()));
// JNative n4 = null;
//
// n4 = new JNative("Termb.dll", "GetPeopleName");
// n4.setRetVal(org.xvolks.jnative.Type.INT); // 指定返回参数的类型
// Pointer a = new Pointer(MemoryBlockFactory.createMemoryBlock(4*10));
// Pointer b = new Pointer(MemoryBlockFactory.createMemoryBlock(4*30));
// n4.setParameter(0,b);
// n4.setParameter(1,a);
// n4.invoke();
// byte[] by = new byte[120];
// by = b.getMemory();
//
// strTmp = new String(by,"gb2312");
// Logger.getLogger(CVR100DemoView.class.getName()).log(Level.SEVERE, null);
//
// byte[] bt = new byte[40];
// bt = a.getMemory();
// len = a.getAsInt(0);
// a.dispose();
// b.dispose();
// System.out.println("-------------name="
// + Integer.parseInt(n4.getRetVal()));
// System.out.println("-------------name="+strTmp);
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
二,用JNA方法调用.dll文件动态库
public interface Dll extends Library {
Dll instance = (Dll) Native.loadLibrary("Termb", Dll.class);
Dll SDT = (Dll) Native.loadLibrary("sdtapi", Dll.class);
public int CVR_InitComm(int Port);// 初始化连接
public int CVR_Authenticate();// 卡认证
public int CVR_Read_Content(int active);// 读取卡信息
public int GetPeopleName(byte[] name, byte[] lneg);// 获得身份证姓名
public int GetPeopleSex(byte[] name, byte[] lneg);// 获得身份证性别
public int GetPeopleNation(byte[] name, byte[] lneg); // 得到民族信息
public int GetPeopleBirthday(byte[] name, byte[] lneg);// 得到出生日期
public int GetPeopleAddress(byte[] name, byte[] lneg);// 得到地址信息
public int GetPeopleIDCode(byte[] name, byte[] lneg);// 得到卡号信息
public int GetDepartment(byte[] name, byte[] lneg);// 得到发证机关信息
public int GetStartDate(byte[] name, byte[] lneg);// 得到有效开始日期
public int GetEndDate(byte[] name, byte[] lneg); // 得到有效截止日期
}
public String[] idcardReader() {
try {
// System.out.println("-------------------进入方法");
String[] idcard = new String[8];
int initComm = Dll.instance.CVR_InitComm(1001);// 初始化连接
if (initComm == 1) {
int authenticate = Dll.instance.CVR_Authenticate();// 读卡器和卡片之间的合法身份确认
if (authenticate == 1) {
// System.out.println("------------------authenticate=" +
// authenticate);
int Read_Content = Dll.instance.CVR_Read_Content(4);// 读取身份证信息
// System.out.println("------------------Read_Content=" +
// Read_Content);
if (Read_Content == 1) {
byte[] midbytes = new byte[1024];
byte[] leng = new byte[1024];
int res = Dll.instance.GetPeopleName(midbytes, leng);
int le = returnActualLength(midbytes);
System.out.println("姓名--" + result(midbytes, le));
idcard[0] = result(midbytes, le);
res = Dll.instance.GetPeopleSex(midbytes, leng);
le = returnActualLength(midbytes);
System.out.println("性别--" + result(midbytes, le));
idcard[1] = result(midbytes, le);
res = Dll.instance.GetPeopleNation(midbytes, leng);
le = returnActualLength(midbytes);
System.out.println("民族--" + result(midbytes, le));
idcard[2] = result(midbytes, le);
res = Dll.instance.GetPeopleBirthday(midbytes, leng);
le = returnActualLength(midbytes);
System.out.println("生日--" + result(midbytes, le));
idcard[3] = result(midbytes, le);
res = Dll.instance.GetPeopleAddress(midbytes, leng);
le = returnActualLength(midbytes);
System.out.println("地址--" + result(midbytes, le));
idcard[4] = result(midbytes, le);
res = Dll.instance.GetPeopleIDCode(midbytes, leng);
le = returnActualLength(midbytes);
System.out.println("身份证--" + result(midbytes, le));
idcard[5] = result(midbytes, le);
res = Dll.instance.GetDepartment(midbytes, leng);
le = returnActualLength(midbytes);
System.out.println("签发机关--" + result(midbytes, le));
idcard[6] = result(midbytes, le);
res = Dll.instance.GetStartDate(midbytes, leng);
le = returnActualLength(midbytes);
System.out.println("开始日期--" + result(midbytes, le));
idcard[7] = result(midbytes, le);
res = Dll.instance.GetEndDate(midbytes, leng);
le = returnActualLength(midbytes);
System.out.println("结束日期--" + result(midbytes, le));
idcard[7] = idcard[7] + "-" + result(midbytes, le);
return idcard;
} else {
String[] err = { "读取身份证信息失败!" };
return err;
}
} else {
String[] err = { "寻卡失败,请把身份证重新放置!" };
return err;
}
} else {
String[] err = { "连接身份证读卡器失败!" };
return err;
}
} catch (Exception e) {
String[] err = { "读取身份证异常!" };
return err;
}
}