厂家提供了两个DLL文件和JAVA程序,我自己写了一个applet和一个html文件,内容如下:请各位大侠们帮帮小弟看看,是错在哪里?谢谢!
我的目录结构是:在bin下面建了一个nhis的文件夹:在下面分别建了一个dcic和一个nhis,文件dcic32.dll,Rd600.dll,Rd600.java存放在dcic下面。myApplet.java放在nhis/nhis下面。test.html放在nhis下面。
一、厂家提供的Rd600.java:
/*
该程序的使用方法:
编译Rd600.java,注意Rd600大小写!
javac Rd600.java
即可生成Rd600.class
*/
package nhis.dcic;
public class Rd600
{
/*一个小例子函数,可以做调试用*/
public int add_s(int i)
{
return i+1;
}
public native int IC_InitComm(int port);
public native int IC_ExitComm(int icdev);
public native int IC_Status(int icdev);
public native int IC_InitType(int icdev,int ctype);
//2003-02-11
public native int IC_Down(int icdev);
//2004-12-8
public native int IC_InitCommAdvanced(int port);
public native int IC_Reset(int idComDev);
public native int IC_DevBeep(int icdev,char beeptime);
public native int IC_ReadVer(int icdev,char[] Ver);
public native int IC_ReadDevice(int idComDev,short offset,short len, char[] databuffer);
public native int IC_WriteDevice(int idComDev,short offset,short len, char[] databuffer);
public native int IC_ReadDevice_Hex(int idComDev,short offset,short len, char[] databuffer);
public native int IC_WriteDevice_Hex(int idComDev,short offset,short len, char[] databuffer);
public native int IC_Encrypt( char[] key,char[] ptrSource, short msgLen, char[] ptrDest);
public native int IC_Decrypt( char[] key,char[] ptrSource, short msgLen, char[] ptrDest);
public native int IC_Encrypt_Hex( char[] key,char[] ptrSource, short msgLen, char[] ptrDest);
public native int IC_Decrypt_Hex( char[] key,char[] ptrSource, short msgLen, char[] ptrDest);
public native int IC_InitComm_Baud(int port,int combaud);
public native int IC_SetCommTimeout(int lTime_ms,int sTime_ms);
//cpu
public native int IC_CpuReset(int idComDev, char[] rlen, char[] databuffer);
public native int IC_CpuApdu(int idComDev, char slen, char[] sendbuffer,char[] rlen, char[] databuffer);
public native int IC_CpuApduSource(int idComDev, char slen, char[] sendbuffer,char[] rlen, char[] databuffer);
public native int IC_CpuReset_Hex(int idComDev, char[] rlen, char[] databuffer);
public native int IC_CpuApdu_Hex(int idComDev, char slen, char[] sendbuffer,char[] rlen, char[] databuffer);
public native int IC_CpuApduSource_Hex(int idComDev, char slen, char[] sendbuffer,char[] rlen, char[] databuffer);
public native int IC_CpuGetProtocol(int idComDev);
public native int IC_CpuApduRespon(int idComDev, char slen, char[] sendbuffer,char[] rlen, char[] databuffer);
public native int IC_CpuSetProtocol(int idComDev,char cardp);
//4442
public native int ReadCount_SLE4442(int icdev);
public native int CheckPass_4442hex(int icdev,char[] data);
public native int ChangePass_4442hex(int icdev,char[] data);
public native int CheckPass_SLE4442(int icdev,char[] data);
public native int ChangePass_SLE4442(int icdev,char[] data);
//2004-12-8
public native int ReadPass_SLE4442(int icdev,char[] data);
public native int ReadPass_4442hex(int icdev,char[] data);
public native int ReadWithProtection_SLE4442(int icdev, short offset,short len,char[] data);
public native int WriteWithProtection_SLE4442(int icdev, short offset,short len,char[] data);
//
//4428
public native int ReadCount_SLE4428(int icdev);
public native int CheckPass_4428hex(int icdev,char[] data);
public native int ChangePass_4428hex(int icdev,char[] data);
public native int CheckPass_SLE4428(int icdev,char[] data);
public native int ChangePass_SLE4428(int icdev,char[] data);
//2004-12-8
public native int ReadWithProtection_SLE4428(int icdev, short offset,short len,char[] data);
public native int WriteWithProtection_SLE4428(int icdev, short offset,short len,char[] data);
//
public native int IC_Read_Hex(int icdev,int offset,int len,char[] databuf);
public native int IC_Read(int icdev,int offset,int len,char[] databuf);
public native int IC_Write_Hex(int icdev,int offset,int len,char[] data);
public native int IC_Write(int icdev,int offset,int len,char[] data);
//102 2004-12-8
public native int IC_Erase(int idComDev,short offset,short len);
public native int IC_Erase_102(int idComDev,short offset,short len);
public native int IC_Fuse_102(int idComDev);
public native int IC_ReadCount_102(int idComDev);
public native int IC_CheckPass_102(int idComDev,char[] password);
public native int IC_ChangePass_102(int idComDev,char[] password);
public native int IC_CheckAZPass_102(int idComDev,short zone, char[] password);
public native int IC_ChangeAZPass_102(int idComDev,short zone, char[] password);
public native int IC_CheckPass_102hex(int idComDev,char[] password);
public native int IC_ChangePass_102hex(int idComDev,char[] password);
public native int IC_CheckAZPass_102hex(int idComDev,short zone, char[] password);
public native int IC_ChangeAZPass_102hex(int idComDev,short zone, char[] password);
/*24系列卡专用*/
public native int IC_Write24_Hex(int icdev,int offset,int len,char[] data);
public native int IC_Write24(int icdev,int offset,int len,char[] data);
//2004-12-8
public native int IC_Write64_Hex(int icdev,int offset,int len,char[] data);
public native int IC_Write64(int icdev,int offset,int len,char[] data);
//45DB041 2004-12-8
public native int IC_DirectRead(int idComDev,short page,short offset,short bytes,char[] buff);
public native int IC_DirectWrite(int idComDev,short page,short offset,short bytes,char[] buff);
public native int IC_DirectRead_Hex(int idComDev,short page,short offset,short bytes,char[] buff);
public native int IC_DirectWrite_Hex(int idComDev,short page,short offset,short bytes,char[] buff);
//SSF1101 2004-12-8
public native int IC_Read_1101(int idComDev,short page,short offset,short bytes,char[] buff);
public native int IC_Write_1101(int idComDev,short page,short offset,short bytes,char[] buff);
public native int IC_Read_1101hex(int idComDev,short page,short offset,short bytes,char[] buff);
public native int IC_Write_1101hex(int idComDev,short page,short offset,short bytes,char[] buff);
//
//4404 2004-12-8
public native int IC_Fuse_4404(int icdev);
public native int IC_ReadCount_4404(int icdev);
public native int IC_CheckPass_4404(int idComDev, char[] password);
public native int IC_ChangePass_4404(int idComDev, char[] password);
public native int IC_CheckAZPass_4404(int idComDev, char[] password);
public native int IC_ChangeAZPass_4404(int idComDev, char[] password);
public native int IC_CheckPass_4404hex(int idComDev, char[] password);
public native int IC_ChangePass_4404hex(int idComDev, char[] password);
public native int IC_CheckAZPass_4404hex(int idComDev, char[] password);
public native int IC_ChangeAZPass_4404hex(int idComDev, char[] password);
//4406 2004-12-8
public native int IC_RValue(int idComDev);
public native int IC_DEValue(int idComDev,short num);
public native int IC_Fuse_4406(int icdev, short value);
public native int IC_ReadCount_4406(int icdev);
public native int IC_CheckPass_4406(int idComDev, char[] password);
public native int IC_Erase_4406(int idComDev, char offset);
public native int IC_CheckPass_4406hex(int idComDev, char[] password);
public native int IC_CheckPass_4406userhex(int idComDev, char[] password);
public native int IC_CheckPass_4406user(int idComDev, char[] password);
/*1604卡专用*/
public native int IC_Fuse_1604(int icdev);
public native int ReadCount_1604(int icdev,int area);
public native int CheckPass_1604hex(int icdev,int area,char[] data);
public native int ChangePass_1604hex(int icdev,int area,char[] data);
public native int CheckPass_1604(int icdev,int area,char[] data);
public native int ChangePass_1604(int icdev,int area,char[] data);
//1604B 2004-12-8
public native int IC_Fuse_1604B(int icdev);
public native int IC_ReadCount_1604B(int icdev,int area);
public native int IC_CheckPass_1604Bhex(int icdev,int area,char[] data);
public native int IC_ChangePass_1604Bhex(int icdev,int area,char[] data);
public native int IC_CheckPass_1604B(int icdev,int area,char[] data);
public native int IC_ChangePass_1604B(int icdev,int area,char[] data);
/*1608 卡专用函数*/
public native int IC_CheckRPassword_Hex(int icdev,int Zone,char[] Pin);
public native int IC_CheckWPassword_Hex(int icdev,int Zone,char[] Pin);
public native int IC_CheckRPassword(int icdev,int Zone,char[] Pin);
public native int IC_CheckWPassword(int icdev,int Zone,char[] Pin);
public native int IC_ChangeRPassword_Hex(int icdev,int Zone,char[] Pin);
public native int IC_ChangeWPassword_Hex(int icdev,int Zone,char[] Pin);
public native int IC_ChangeRPassword(int icdev,int Zone,char[] Pin);
public native int IC_ChangeWPassword(int icdev,int Zone,char[] Pin);
public native int IC_WriteFuse(int icdev,int fusetype);
public native int IC_ReadFuse(int icdev);
public native int IC_WriteUserZone(int icdev,int offset,int len,char[] data);
public native int IC_WriteConfigZone(int icdev,int offset,int len,char[] data);
public native int IC_WriteUserZone_Hex(int icdev,int offset,int len,char[] data);
public native int IC_WriteConfigZone_Hex(int icdev,int offset,int len,char[] data);
public native int IC_ReadUserZone(int icdev,int offset,int len,char[] data);
public native int IC_ReadConfigZone(int icdev,int offset,int len,char[] data);
public native int IC_ReadUserZone_Hex(int icdev,int offset,int len,char[] data);
public native int IC_ReadConfigZone_Hex(int icdev,int offset,int len,char[] data);
public native int IC_ReadWPasswordCount(int icdev,int Zone);
public native int IC_ReadRPasswordCount(int icdev,int Zone);
public native int IC_SetUserZone(int icdev,int Zone);
//2个工具函数,用于字符串格式的转换 2004-12-8
public native int hex2asc(char[] strhex, char[] strasc,short len);
public native int asc2hex(char[] strasc, char[] strhex,short len);
/**/
public Rd600()
{
}
/*
包含了动态库Rd600.dll的名字,动态库应该放在系统目录(windows/system32)当前目录!
*/
static
{
System.loadLibrary( "Rd600" );
}
}
说明文件已经成功编译并测试过,能够正常运行。包括dcic32.dll和Rd600.dll都放在了system32及%JAVA_HOME%/bin和%JAVA_HOME%/bin/nhis/dcic/下面。同时也打包成dcic.jar放在ext目录下。
二、测试文件JavaCardNo.java
import java.io.*;
class JavaCardNo extends Rd600
{
public static void main( String[] args) throws IOException
{
Rd600 obj = new Rd600();
int icdev,st,i,Rtn = 0;
boolean bna;
char bptime;
char [] pass =new char [6];
char [] len = new char [2];
char [] rdata=new char [33];
char [] wdata=new char [32];
char [] rstdata = new char [64];
int itype;
short sOffset,sLen,sPage;
char cLen;
//初始化通讯口
icdev=obj.IC_InitComm(0);
if (icdev<=0)
{
System.out.println("Init comm Error");
return ;
}
else
{
System.out.println("Init comm OK");
}
bptime=90;
//响蜂鸣器
st=obj.IC_DevBeep(icdev,bptime);
if (st!=0)
{
System.out.println("IC_DevBeep Error");
return;
}
System.out.println("IC_DevBeep OK");
st=obj.IC_Status(icdev);
if (st!=0)
{
if (st==1)
{
System.out.println("NO card");
}
else
{
System.out.println("Status Error");
}
return;
}
System.out.println("Status OK");
itype=4;
st = obj.IC_InitType(icdev,itype);
if (st!=0)
{
System.out.println("Inittype 4428 error");
return;
}
System.out.println("Inittype ok");
//从此读取25位卡号.
st=obj.IC_Read(icdev,80,25,rdata);
if (st!=0)
{
System.out.println("Read Error");
return ;
}
String IcCardNo = "";
for(int j =0;j<25;j++)
{
IcCardNo=IcCardNo+rdata[j];
}
System.out.println(IcCardNo);
System.out.println("测试成功。/n");
}
}
测试结果:
d:/j2sdk/bin/>java JavaCardNo
Init comm OK
IC_DevBeep OK
Status OK
Inittype OK
62463320071821248D6C32345
三、我写的applet如下:
package nhis;
import java.awt.*;
import java.applet.*;
import nhis.dcic.Rd600;
public class nhis extends Applet{
int icdev=0;
int lDevice = 0, Rtn = 0, st=0;
private String cardNo="";
public String getCardNo() {
return cardNo;
}
public void setCardNo(String cardNo)
{
this.cardNo = cardNo;
}
public String getNo(String a)
{
return a;
}
public void init() {
Rd600 obj = new Rd600();
char bptime;
char [] len = new char [2];
char [] rdata=new char [33];
int itype;
try{
//初始化通讯口
icdev=obj.IC_InitComm(0);
if (icdev<=0)
{
System.out.println("Init comm Error");
return ;
}
else
{
System.out.println("Init comm OK");
}
bptime=90;
//响蜂鸣器
st=obj.IC_DevBeep(icdev,bptime);
if (st!=0)
{
System.out.println("IC_DevBeep Error");
return;
}
System.out.println("IC_DevBeep OK");
st=obj.IC_Status(icdev);
if (st!=0)
{
if (st==1)
{
System.out.println("NO card");
}
else
{
System.out.println("Status Error");
}
return;
}
System.out.println("Status OK");
itype=4;
st = obj.IC_InitType(icdev,itype);
if (st!=0)
{
System.out.println("Inittype 4428 error");
return;
}
System.out.println("Inittype Ok");
//从此读取25位卡号.
st=obj.IC_Read(icdev,80,25,rdata);
if (st!=0)
{
System.out.println("Read Error");
return ;
}
String IcCardNo = "";
for(int j =0;j<25;j++)
{
IcCardNo=IcCardNo+rdata[j];
}
this.setCardNo(IcCardNo);
}catch(Exception ee)
{
this.setCardNo(""+ee);
}
}
public void paint(Graphics g)
{
g.drawString(this.getCardNo(),50,50);
}
}
说明:能够编译通过,生成class文件。
四、我的html文件如下:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<meta name="GENERATOR" content="Microsoft FrontPage 4.0">
<meta name="ProgId" content="FrontPage.Editor.Document">
<title>Hello World</title>
<script language="Javascript" type="text/JavaScript">
var s =""
function init()
{
s = document.at.getCardNo();
alert(s);
var byte_array = new Array();
for(var i = 0; i < 6; i ++)
{
byte_array[i] = 'a';
}
s=document.at.getNo(byte_array);
alert(s);
}
</script>
</head>
<body οnlοad="init()">
<applet codebase="." name="at" code="nhis.myApplet" width="200" height="100"></applet>
</body>
</html>
错误提示如下:
D:/j2sdk/bin>appletviewer nhis/test.html
java.lang.UnsatisfiedLinkError: IC_InitComm
at nhis.dcic.Rd600.IC_InitComm(Native Method)
at nhis.nhis.init(nhis.java:36)
at sun.applet.AppletPanel.run(AppletPanel.java:353)
at java.lang.Thread.run(Thread.java:534)
求各位大侠指点,小弟弟谢谢各位!