最新使用java开发桌面程序,涉及到使用java调用二代身份证读卡获取人员身份、照片信息,使用厂家提供的SDK包,始终无法成功调用,碰到过很多问题,这里记录一下。最开始使用windows7 64操作系统,JDK64位,调用时要么出现:Unable to load library错误,要么出现接口方法无法初始化.厂家提供的是JNative.jar调用方式,经过查询,发现JNative不支持JDK64位,一度怀疑是厂家提供的动态链接库在64位操作系统下无法使用,想要厂家提供64位的动态链接库,结果厂家不搭理,只能自己想办法了。经过多次测试终于使程序可以正常在windows7 32位和windows 7 64位操作系统上正常运行:
这里使用的是jna调用jar:
使用jna进行调用,在win7 32位操作系统:
动态链接库文件:
1)将动态链接库拷贝到:
C:\Windows\System32 目录下.
2)将动态链接库拷贝到项目的src目录下,编译后在bin目录中.
加载时:
String path= TestDlg.class.getResource("/").getPath().substring(1).replace("/","\\")+ "SynIDCardAPI";
SynIDCardAPIINSTANCE =(SynIDCardAPI)Native.loadLibrary(path,SynIDCardAPI.class);
3)在32位操作系统下自然使用JDK32
使用jna进行调用,在windows7 64位操作系统下:
使用JDK32版本,eclipse 32位,那么动态链接库都要拷贝到两个位置:
1)拷贝到C:\Windows\SysWOW64目录下(在64位操作系统下,可能是由于动态链接库的问题,还是只能使用32位的JDK,使用64位jdk还是无法正常使用,动态链接库拷贝到SysWOW64下,不要拷贝到System32)
2)将动态链接库拷贝到项目的src目录下,编译后在bin目录中
加载时:
String path= TestDlg.class.getResource("/").getPath().substring(1).replace("/","\\")+ "SynIDCardAPI";
SynIDCardAPIINSTANCE =(SynIDCardAPI)Native.loadLibrary(path,SynIDCardAPI.class);
3)在64位操作系统下,也使用JDK32,这个可能和使用的动态链接库有关,或许我使用的动态链接库就是32位的。不确定如果是64位的动态链接库是否可以正常运行.
使用过程中,一般容易报:
Unable to load library
java.lang.UnsatisfiedLinkError: com.sun.jna.Native.pointerSize(),
java.lang.NoClassDefFoundError: Could not initialize class com.synjones.angel.TestDlg$SynIDCardAPI
错误原因:
1.动态链接库位置不对。
2.jdk 使用32或64位未匹配出现的问题。