实验室里有两套硬件,不同厂家的,各提供了一个DLL文件。
硬件一,通过JNI技术,使用JAVA访问DLL文件成功。
硬件二,采用与一同样方法,却出现以下错误:
public native static long openReader(); //调用该native函数时出错;#
# An unexpected error has been detected by HotSpot Virtual Machine:
#
# EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x00000000, pid=3576, tid=3580
#
# Java VM: Java HotSpot(TM) Client VM (1.5.0_03-b07 mixed mode)
# Problematic frame:
# C 0x00000000
#
# An error report file with more information is saved as hs_err_pid3576.log
#
# If you would like to submit a bug report, please visit:
# http://java.sun.com/webapps/bugreport/crash.jsp
#产生个疑问,会不会是这两个厂家提供的DLL开发语言不同?JNI支持在本地代码中调用所有语言写的DLL吗?
硬件一,通过JNI技术,使用JAVA访问DLL文件成功。
硬件二,采用与一同样方法,却出现以下错误:
public native static long openReader(); //调用该native函数时出错;#
# An unexpected error has been detected by HotSpot Virtual Machine:
#
# EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x00000000, pid=3576, tid=3580
#
# Java VM: Java HotSpot(TM) Client VM (1.5.0_03-b07 mixed mode)
# Problematic frame:
# C 0x00000000
#
# An error report file with more information is saved as hs_err_pid3576.log
#
# If you would like to submit a bug report, please visit:
# http://java.sun.com/webapps/bugreport/crash.jsp
#产生个疑问,会不会是这两个厂家提供的DLL开发语言不同?JNI支持在本地代码中调用所有语言写的DLL吗?
楼主【changleqy】截止到2008-06-25 21:03:44的历史汇总数据(不包括此帖):
发帖数:32 发帖分:670
结贴数:30 结贴分:630
未结数:2 未结分:40
结贴率:93.75 % 结分率:94.03 %
值得尊敬
这只是我的理解,所以想知道lz的代码是怎么写的.
问题描述
一) 首先使用VC6,win32 console application调用READER.DLL中的程序,调用成功。二) 使用JNI技术,以在JAVA中调用READER.DLL
//C++本地代码如下:
JNIEXPORT jint JNICALL Java_rfid_Reader_openReader(JNIEnv *env, jobject obj)
{
HINSTANCE hDll;
hDll=LoadLibrary("Reader.dll");
typedef short (__stdcall *pOpenReader) (HANDLE *hCom, unsigned char LinkType,char *com_port);
pOpenReader OpenReader;
OpenReader=(pOpenReader)GetProcAddress(hDll,"OpenReader"); //初始化hcom
HANDLE hcom;
long a;
hcom=&a;
HANDLE *pcom=&hcom; int iBack;
iBack=OpenReader(pcom,2,"10.21.9.58"); //标记一:!!!!调用函数!!!!!
if(iBack==0)
{
return 0;
}
else
{
return -1;
}
}
//JAVA端程序(相关主要代码)
package rfid;public class Reader
{
public native int openReader();
public static void main(String[] args)
{
System.loadLibrary("TestReader"); //标记二:TestReader是本地代码中新形成的DLL
long iBack;
Reader reader=new Reader();
iBack=reader.openReader(); //调用本地代码中的openReader函数
System.out.print(iBack);
}}说明:先将C++本地代码编译成TestReader.dll,成功。在JAVA程序中,调用定义在TestReader.dll中的openReader函数时,出现错误,错误位置在“标记二”,如下:
#
# An unexpected error has been detected by HotSpot Virtual Machine:
#
# EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x00000000, pid=3576, tid=3580
#
# Java VM: Java HotSpot(TM) Client VM (1.5.0_03-b07 mixed mode)
# Problematic frame:
# C 0x00000000
#
# An error report file with more information is saved as hs_err_pid3576.log
#
# If you would like to submit a bug report, please visit:
# http://java.sun.com/webapps/bugreport/crash.jsp
#将“标记一”这行代码屏蔽掉,重新执行,就没问题了。三)使用同样方法,调用另一厂家的DLL,无问题。
但是很奇怪,我将“标记一”这个函数,在WIN32 CONSOLE APPLICATION里直接调用时,就没问题。
一旦通过JNI调用,则原DLL(READER.dll)里所有的函数都无法成功调用
先自己做一个符合JNI规范的testReader.DLL,在testReader.dll里调用原Reader.dll
# Java VM: Java HotSpot(TM) Client VM (1.5.0_03-b07 mixed mode)
# Problematic frame:
# C 0x00000000
”
貌似出现了空指针引用
HANDLE hcom;
long a;
hcom=&a;
HANDLE *pcom=&hcom;
”a没有初始化吧,导致下面的pcom使用出现问题
这里是没问题的,我在WIN32 CONSOLE APPLICATION里调试成功的,然后把里面的函数引入到现在做的JNI的本地代码里;结果是所有的在前者能运行的函数,在后者都无法运行。
代码中:“!!!!!在此行前面的代码,全部无问题,在下面一旦要引用原DLL里的函数,马上就出错!!!!!!!”
JNIEXPORT jint JNICALL Java_rfid_Reader_openReader(JNIEnv *env, jobject obj)
{
HINSTANCE hDll;
hDll=LoadLibrary("Reader.dll");
typedef short (__stdcall *pOpenReader) (HANDLE *hCom, unsigned char LinkType,char *com_port);
pOpenReader OpenReader;
OpenReader=(pOpenReader)GetProcAddress(hDll,"OpenReader"); //初始化hcom
HANDLE hcom;
long a;
hcom=&a;
HANDLE *pcom=&hcom; int iBack;
//!!!!!在此行前面的代码,全部无问题,在下面一旦要引用原DLL里的函数,马上就出错!!!!!!!
iBack=OpenReader(pcom,2,"10.21.9.58"); //标记一:!!!!调用函数!!!!!
原因是,与Reader.dll同目录的地方,应该再放一个其提供的EasyUSB214x.dll