各位大侠,小弟最近用java,jsp开发一个会员系统,涉及到会员卡和ic卡读写器,购买来一套设备,厂家提供了一个windows动态库文件(dll),我需要在java中调用该动态库里的函数,其实函数很简单,只有三个:一个串口初始化HANDLE ComInit(unsigned char port);一个关闭串口函数int ComClose(HANDLE icdev);还有一个读取卡号int ID_Read(HANDLE icdev,int tt,unsigned char *_Data);我尝试使用jni调用dll的方法来做,但出现c和java的类型不匹配的问题,java中无法编译和运行通过。
不知道那位高手此前做过,小弟急需帮助,项目催的很紧啊!多谢了!
不知道那位高手此前做过,小弟急需帮助,项目催的很紧啊!多谢了!
现在的问题是,我在写那个java类时,需要声明那些函数方法,但是在我上面列出的函数中如HANDLE 指针和 usigned char这些类型java中都不能识别,无法编译通过,如何解决呢,多谢各位高手指教了......
static {
//ic卡的函数动态库
System.loadLibrary("TF_ID"); }
public native static HANDLE ComInit(unsigned char port);
public native static int ID_Read(HANDLE icdev,int tt,unsigned char *_Data);
public native static int ComClose(HANDLE icdev); public static void main(String[] args) {
testdll test = new testdll();
//具体的调用方法
..................
}
这是那个java类,可是不能识别HANDLE,指针,以及unsigned char这样的类型,怎么办? 难道就没有高手做过这方面的东西吗? 求解答!!!
java web应用如何来调用客户端的dll?
但是我在网上没有找到这方面的例子.............
尽量找到两者等价类型
最差情况使用byte[],这是最原始的数据大家都能支持
可以在java里自己实现翻译到正确类型的转换
public class testdll {
static
{
System.loadLibrary("TF_ID");
}
public native static String ID_Read();
public static void main(String[] args) {
testdll test = new testdll();
String a=test.ID_Read();
System.out.println(a);
} }
c中调用厂家动态库得代码如下:
#include <iostream.h>
#include <windows.h>
#include <string.h>
#include <testdll.h> typedef HANDLE (_stdcall *COMINT)(unsigned char port);
typedef int (_stdcall *COM_CLOSE)(HANDLE hr);
typedef int (_stdcall *ID_Read)(HANDLE icdev,int tt,unsigned char *_Data);
JNIEXPORT jstring JNICALL Java_testdll_ID_1Read(JNIEnv* env,jclass)
{
HINSTANCE hTest;
HANDLE hr;
COMINT pComInit;
COM_CLOSE pComClose;
ID_Read pRead;
int j;
unsigned char data[16]="put card on it",*A=data;
jstring jstr; hTest=LoadLibrary("TF_ID.dll");
pComInit=(COMINT)GetProcAddress(hTest,"ComInit");
pComClose=(COM_CLOSE)GetProcAddress(hTest,"ComClose");
pRead=(ID_Read)GetProcAddress(hTest,"ID_Read");
hr=pComInit(1);
j=pRead(hr,3000,data); char b[16]="put card on it",*B=b;
for(int i=0;i<16;i++)
*(B+i)=*(A+i);
jstr=env->NewStringUTF(b);
if(j==8)
return jstr;
else
return jstr;
pComClose(hr);
FreeLibrary(hTest);}
java程序执行得错误如下:An unexpected exception has been detected in native code outside the VM.
Unexpected Signal : EXCEPTION_ACCESS_VIOLATION (0xc0000005) occurred at PC=0x0
Function=[Unknown.]
Library=(N/A)NOTE: We are unable to locate the function name symbol for the error
just occurred. Please refer to release documentation for possible
reason and solutions.
Current Java thread:
at testdll.ID_Read(Native Method)
at testdll.main(testdll.java:30)Dynamic libraries:
0x00400000 - 0x0040B000 D:\j2sdk1.4.2_08\bin\java.exe
0x77F50000 - 0x77FF7000 C:\WINDOWS\System32\ntdll.dll
0x77E40000 - 0x77F4E000 C:\WINDOWS\system32\kernel32.dll
0x77DA0000 - 0x77E3B000 C:\WINDOWS\system32\ADVAPI32.dll
0x78000000 - 0x78086000 C:\WINDOWS\system32\RPCRT4.dll
0x77BE0000 - 0x77C33000 C:\WINDOWS\system32\MSVCRT.dll
0x08000000 - 0x08138000 D:\j2sdk1.4.2_08\jre\bin\client\jvm.dll
0x77D10000 - 0x77D9C000 C:\WINDOWS\system32\USER32.dll
0x77C40000 - 0x77C80000 C:\WINDOWS\system32\GDI32.dll
0x76B10000 - 0x76B39000 C:\WINDOWS\System32\WINMM.dll
0x76300000 - 0x7631C000 C:\WINDOWS\System32\IMM32.DLL
0x62C20000 - 0x62C28000 C:\WINDOWS\System32\LPK.DLL
0x72F10000 - 0x72F6A000 C:\WINDOWS\System32\USP10.dll
0x10000000 - 0x10007000 D:\j2sdk1.4.2_08\jre\bin\hpi.dll
0x003F0000 - 0x003FE000 D:\j2sdk1.4.2_08\jre\bin\verify.dll
0x008A0000 - 0x008B9000 D:\j2sdk1.4.2_08\jre\bin\java.dll
0x008C0000 - 0x008CE000 D:\j2sdk1.4.2_08\jre\bin\zip.dll
0x02CC0000 - 0x02CF3000 D:\TF_ID.dll
0x76C60000 - 0x76C82000 C:\WINDOWS\system32\imagehlp.dll
0x6D8A0000 - 0x6D91D000 C:\WINDOWS\system32\DBGHELP.dll
0x77BD0000 - 0x77BD7000 C:\WINDOWS\system32\VERSION.dll
0x76BC0000 - 0x76BCB000 C:\WINDOWS\System32\PSAPI.DLLHeap at VM Abort:
Heap
def new generation total 576K, used 145K [0x10010000, 0x100b0000, 0x104f0000) eden space 512K, 28% used [0x10010000, 0x100346b0, 0x10090000)
from space 64K, 0% used [0x10090000, 0x10090000, 0x100a0000)
to space 64K, 0% used [0x100a0000, 0x100a0000, 0x100b0000)
tenured generation total 1408K, used 0K [0x104f0000, 0x10650000, 0x14010000)
the space 1408K, 0% used [0x104f0000, 0x104f0000, 0x104f0200, 0x10650000)
compacting perm gen total 4096K, used 1270K [0x14010000, 0x14410000, 0x1801000
0)
the space 4096K, 31% used [0x14010000, 0x1414dbe8, 0x1414dc00, 0x14410000)Local Time = Tue Nov 08 14:03:58 2005
Elapsed Time = 0
#
# The exception above was detected in native code outside the VM
#
# Java VM: Java HotSpot(TM) Client VM (1.4.2_08-b03 mixed mode)
#
# An error report file has been saved as hs_err_pid3876.log.
# Please refer to the file for further information.
#
问题终于解决了!!!多谢多谢!
我知道还可以采用jacob的方式或调控件的方式来做,希望大家提出来共同研究,共同进步!
好了,废话了这么多,该给大家发分了,可惜分数太少,又有很多朋友,所以只能平均给了,望大家谅解,下次一定多给分!!!请多多跟我联系!!