最近在搞一个B/S结构的银行项目,要利用IC读卡器获取卡号,DLL文件放在了项目src下,接口文件如下:import com.sun.jna.Native;
import com.sun.jna.win32.StdCallLibrary;
public class DllGetCardno {
public interface JNATestDll extends StdCallLibrary {  
JNATestDll instanceDll  = (JNATestDll)Native.loadLibrary("libCCIDSource",JNATestDll.class);  
public void  GetLastErrInfo(String lastErr);
public int  GetCardNumber(byte[] cardNumber);

}然后applet文件调接口,解析获取的卡号:public void init() {
System.out.println("init");
JNATestDll.instanceDll.GetCardNumber(a);
System.out.println("loaddll");
String cardnum = "";
for(int i = 0;i<a.length;i++){
if("0".equals(a[i])){
break;
}
if("48".equals(a[i])|| a[i]==48){
cardnum = cardnum+"0";
}else if("49".equals(a[i])|| a[i]==49){
cardnum = cardnum+"1";
}else if("50".equals(a[i])|| a[i]==50){
cardnum = cardnum+"2";
}else if("51".equals(a[i])|| a[i]==51){
cardnum = cardnum+"3";
}else if("52".equals(a[i])|| a[i]==52){
cardnum = cardnum+"4";
}else if("53".equals(a[i])|| a[i]==53){
cardnum = cardnum+"5";
}else if("54".equals(a[i])|| a[i]==54){
cardnum = cardnum+"6";
}else if("55".equals(a[i])|| a[i]==55){
cardnum = cardnum+"7";
}else if("56".equals(a[i])|| a[i]==56){
cardnum = cardnum+"8";
}else if("57".equals(a[i])|| a[i]==57){
cardnum = cardnum+"9";
}
}
System.out.println(cardnum);
}当接口里的load路径写成静态的,如“D:\\libCCIDSource”的时候,eclipse内单执行applet文件可以输出正确的卡号,但是打包成jar文件后在jsp页面执行就报错了。
jsp页面:<html>
<body>
<applet id="hh" alt="Applet" width="300" height="300" 
code="publics.MyApplet.class" 
archive="applet.jar,jna-3.5.1.jar,platform.jar"
codebase="." mayscript>
</applet> 
</body>
</html>报错如下:java控制台输出init,后面的loaddll没有,所以我觉得是加载dll失败了。
请教用过applet调用dll串口的大神们,指点指点,已经花了很长时间了,都没研究出来。appletdlljni

解决方案 »

  1.   

    不要把dll打在jar包里,访问不到dll的!我研究过这个问题。
    放jar包外面。
    具体研究看这里:http://blog.csdn.net/withiter/article/details/11924095
      

  2.   

    这个写法我试过了,没用啊,dll跟普通文件应该不一样吧?
      

  3.   

    你把详细出错的贴出来。
    我的意思不是写法啊,是如果你把dll打包到jar里面就获取不到了,其实就是加载dll找不到文件
      

  4.   

    能放的地方我都试过了,什么jdk/bin下啦,system32下啦,项目src下啊,只要tomcat发布,一访问页面就弹出上面的错误,我查了下,意思是表示静态初始化失败,我也知道是加载不到dll文件,但是到底该如何做呢,有人讲用ocx控件搞什么activex加载,但是我没用过,不知道怎么搞,而且我想尽量的在java,eclipse里面搞定
      

  5.   

    上面已经贴出来了,后台不报错的,就页面上的java控制台报的错,我现在换了个加载dll初始化方式,结果,现在报错说权限不够了public void init() {
    System.out.println("init");
    System.load("C:\\Windows\\System32\\libCCIDSource.dll");
    System.out.println("loaddll");
    }现在报错是:
    感觉做的数字签名和java.policy权限都没用
      

  6.   

    上面已经贴出来了,后台不报错的,就页面上的java控制台报的错,我现在换了个加载dll初始化方式,结果,现在报错说权限不够了public void init() {
    System.out.println("init");
    System.load("C:\\Windows\\System32\\libCCIDSource.dll");
    System.out.println("loaddll");
    }现在报错是:
    感觉做的数字签名和java.policy权限都没用点击详细,贴一下
      

  7.   

    上面已经贴出来了,后台不报错的,就页面上的java控制台报的错,我现在换了个加载dll初始化方式,结果,现在报错说权限不够了public void init() {
    System.out.println("init");
    System.load("C:\\Windows\\System32\\libCCIDSource.dll");
    System.out.println("loaddll");
    }现在报错是:
    感觉做的数字签名和java.policy权限都没用点击详细,贴一下
    右边的弹窗就是点击详细后的