实验室里有两套硬件,不同厂家的,各提供了一个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吗?

解决方案 »

  1.   

    此回复为自动发出,仅用于显示而已,并无任何其他特殊作用
    楼主【changleqy】截止到2008-06-25 21:03:44的历史汇总数据(不包括此帖):
    发帖数:32                 发帖分:670                
    结贴数:30                 结贴分:630                
    未结数:2                  未结分:40                 
    结贴率:93.75 %            结分率:94.03 %            
    值得尊敬
      

  2.   

    我只听说过jni是调用c/c++的dll
      

  3.   

    jni只能调C/C++写的DLL,其他语言的MS不行。
      

  4.   

    理论上什么DLL都有可以,因为DLL是二进制形式的,与语言无关。我像先问一下,你是怎么调用第一个硬件的DLL的,能不能贴下代码?
      

  5.   

    是不是第二个dll,没有实现那个本地方法:openReader()
      

  6.   

    java调用的dll里的函数命名应该是由jvm生成的,这就是我们自己在写的时候药用javah生成头文件的原因,也许你第一个硬件的dll本身就考虑了java调用的情况,而第二个没有.
    这只是我的理解,所以想知道lz的代码是怎么写的.
      

  7.   

    Windows平台上,普通的DLL并不是兼容的二进制规范,COM才是
      

  8.   

    多谢大家关注,发问题描述如下:
    问题描述
    一) 首先使用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,无问题。
      

  9.   

    这说明LZ的问题跟java就没有关系,完全是你C++程序的问题,你确定两家硬件的接口一样吗。
      

  10.   


    但是很奇怪,我将“标记一”这个函数,在WIN32 CONSOLE APPLICATION里直接调用时,就没问题。
    一旦通过JNI调用,则原DLL(READER.dll)里所有的函数都无法成功调用
      

  11.   

    两家硬件的DLL接口是不一样的,但是我想通过JNI调用的方法应该是一样的:
    先自己做一个符合JNI规范的testReader.DLL,在testReader.dll里调用原Reader.dll
      

  12.   

    难不成是你下载的jvm的bug期待高手的说法
      

  13.   


    # Java VM: Java HotSpot(TM) Client VM (1.5.0_03-b07 mixed mode)
    # Problematic frame:
    # C  0x00000000

    貌似出现了空指针引用 
      

  14.   


    HANDLE hcom;
    long a;
    hcom=&a;
    HANDLE *pcom=&hcom;
    ”a没有初始化吧,导致下面的pcom使用出现问题 
      

  15.   


    这里是没问题的,我在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");  //标记一:!!!!调用函数!!!!!
      

  16.   

    与厂家联系后,解决了。
    原因是,与Reader.dll同目录的地方,应该再放一个其提供的EasyUSB214x.dll