我使用JNA调用DLL,加载DLL都没有问题,测试后问题是出在DLL中方法参数中,有高人碰见和解决过这个问题吗,如果有求教!

解决方案 »

  1.   

    package com;import com.sun.jna.Library;
    import com.sun.jna.Native;
    import com.sun.jna.NativeLong;
    import com.sun.jna.WString;
    import com.sun.jna.ptr.LongByReference;public class JnaTest1 {
        public interface CEBX2Image extends Library {
        
            //定义Dll文件中的方法
             int C2I_GetDocumentCount(WString szFileName, LongByReference msgCode);
         }    public static void main(String[] args) {     CEBX2Image cEBX2Image = (CEBX2Image) Native.loadLibrary("CEBX2Image", CEBX2Image.class);
         NativeLong [] array = new NativeLong[1];
         array[0]= new NativeLong(1);
         long a  = 1l;
         WString filePath = new WString("F:\\Files\\B_01000047_001.cebx");
         WString key = new WString("123456");
         LongByReference lbr = new LongByReference();
         cEBX2Image.C2I_GetDocumentCount(filePath, null);    }
    }DLL中C++源码:C2IAPI_(C2I_UINT) C2I_GetDocumentCount(LPC2IWSTR szFileName, C2I_InvokeCode* pMsgCode)
    {
        return CC2IDocEngine::GetDocumentCount(szFileName, pMsgCode);
    }程序运行后报如下错误
    # An unexpected error has been detected by Java Runtime Environment:
    #
    #  EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x120082c0, pid=3980, tid=5288
    #
    # Java VM: Java HotSpot(TM) Client VM (11.2-b01 mixed mode windows-x86)
    # Problematic frame:
    # C  [xerces-c_3_0.dll+0x82c0]
    #
    # An error report file with more information is saved as:
    # D:\孙源\JnaTest\hs_err_pid3980.log
    #
     
      

  2.   

    这个是hs_err_pid3980.log错误日志信息,求高人看看是什么问题,个人觉得是C++参数和JAVA方法声明和调用中参数类型不一致造成的!
    #
    # An unexpected error has been detected by Java Runtime Environment:
    #
    #  EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x120082c0, pid=3664, tid=4968
    #
    # Java VM: Java HotSpot(TM) Client VM (11.2-b01 mixed mode windows-x86)
    # Problematic frame:
    # C  [xerces-c_3_0.dll+0x82c0]
    #
    # If you would like to submit a bug report, please visit:
    #   http://java.sun.com/webapps/bugreport/crash.jsp
    # The crash happened outside the Java Virtual Machine in native code.
    # See problematic frame for where to report the bug.
    #---------------  T H R E A D  ---------------Current thread (0x00847000):  JavaThread "main" [_thread_in_native, id=4968, stack(0x008d0000,0x00920000)]siginfo: ExceptionCode=0xc0000005, reading address 0x00000000Registers:
    EAX=0x0091f74c, EBX=0x00000000, ECX=0x00000000, EDX=0x00000070
    ESP=0x0091f738, EBP=0x0091f7a0, ESI=0x0b842260, EDI=0x0b842318
    EIP=0x120082c0, EFLAGS=0x00010206Top of Stack: (sp=0x0091f738)
    0x0091f738:   0b583baa 00000070 3d63174e 0b842260
    0x0091f748:   00000004 0091f76c 0b6b484c ffffffff
    0x0091f758:   0b4f236b 3d63176a 0b842160 00000001
    0x0091f768:   0b842318 0091f794 0b6bafeb 00000000
    0x0091f778:   0b4daedd 3d63178a 0b842160 0091f808
    0x0091f788:   00000001 0b842260 368201ea 0091f7e4
    0x0091f798:   0b6bb2db ffffffff 0affb0d0 0b4b3bde
    0x0091f7a8:   00000000 3d6317ba 00847000 0091f920 Instructions: (pc=0x120082c0)
    0x120082b0:   8b c6 5e c2 04 00 8b 54 24 04 8b 0d c4 bf 1b 12
    0x120082c0:   8b 01 83 c2 08 52 ff 50 08 8b 0d c4 bf 1b 12 89 
    Stack: [0x008d0000,0x00920000],  sp=0x0091f738,  free space=317k
    Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code)
    C  [xerces-c_3_0.dll+0x82c0]Java frames: (J=compiled Java code, j=interpreted, Vv=VM code)
    j  com.sun.jna.Function.invokeInt(I[Ljava/lang/Object;)I+0
    j  com.sun.jna.Function.invoke([Ljava/lang/Object;Ljava/lang/Class;)Ljava/lang/Object;+309
    j  com.sun.jna.Function.invoke(Ljava/lang/Class;[Ljava/lang/Object;Ljava/util/Map;)Ljava/lang/Object;+194
    j  com.sun.jna.Library$Handler.invoke(Ljava/lang/Object;Ljava/lang/reflect/Method;[Ljava/lang/Object;)Ljava/lang/Object;+344
    j  $Proxy0.C2I_GetDocumentCount(Lcom/sun/jna/WString;Lcom/sun/jna/NativeLong;)I+20
    j  com.JnaTest1.main([Ljava/lang/String;)V+66
    v  ~StubRoutines::call_stub---------------  P R O C E S S  ---------------Java Threads: ( => current thread )
      0x0ab0b800 JavaThread "Low Memory Detector" daemon [_thread_blocked, id=4996, stack(0x0ad50000,0x0ada0000)]
      0x0ab05400 JavaThread "CompilerThread0" daemon [_thread_blocked, id=3240, stack(0x0ad00000,0x0ad50000)]
      0x0aaff400 JavaThread "Attach Listener" daemon [_thread_blocked, id=5704, stack(0x0acb0000,0x0ad00000)]
      0x0aafe400 JavaThread "Signal Dispatcher" daemon [_thread_blocked, id=1788, stack(0x0ac60000,0x0acb0000)]
      0x0aae9c00 JavaThread "Finalizer" daemon [_thread_blocked, id=5820, stack(0x0ac10000,0x0ac60000)]
      0x0aae8400 JavaThread "Reference Handler" daemon [_thread_blocked, id=3724, stack(0x0abc0000,0x0ac10000)]
    =>0x00847000 JavaThread "main" [_thread_in_native, id=4968, stack(0x008d0000,0x00920000)]Other Threads:
      0x0aae4c00 VMThread [stack: 0x0ab70000,0x0abc0000] [id=1380]
      0x0ab0d400 WatcherThread [stack: 0x0ada0000,0x0adf0000] [id=5952]VM state:not at safepoint (normal execution)VM Mutex/Monitor currently owned by a thread: NoneHeap
     def new generation   total 960K, used 594K [0x029d0000, 0x02ad0000, 0x02eb0000)
      eden space 896K,  59% used [0x029d0000, 0x02a54a70, 0x02ab0000)
      from space 64K, 100% used [0x02ac0000, 0x02ad0000, 0x02ad0000)
      to   space 64K,   0% used [0x02ab0000, 0x02ab0000, 0x02ac0000)
     tenured generation   total 4096K, used 197K [0x02eb0000, 0x032b0000, 0x069d0000)
       the space 4096K,   4% used [0x02eb0000, 0x02ee16a0, 0x02ee1800, 0x032b0000)
     compacting perm gen  total 12288K, used 3361K [0x069d0000, 0x075d0000, 0x0a9d0000)
       the space 12288K,  27% used [0x069d0000, 0x06d185b8, 0x06d18600, 0x075d0000)
    No shared spaces configured.Dynamic libraries:
    0x00400000 - 0x00424000  D:\founder\jdk1.6\bin\javaw.exe
    0x7c930000 - 0x7ca00000  E:\WINDOWS\system32\ntdll.dll
    0x7c800000 - 0x7c92b000  E:\WINDOWS\system32\kernel32.dll
    0x77f30000 - 0x77fdb000  E:\WINDOWS\system32\ADVAPI32.dll
    0x77c20000 - 0x77cbf000  E:\WINDOWS\system32\RPCRT4.dll
    0x76eb0000 - 0x76ec3000  E:\WINDOWS\system32\Secur32.dll
    0x77e10000 - 0x77ea0000  E:\WINDOWS\system32\USER32.dll
    0x77bd0000 - 0x77c18000  E:\WINDOWS\system32\GDI32.dll
    0x76180000 - 0x7619d000  E:\WINDOWS\system32\IMM32.DLL
    0x7f000000 - 0x7f009000  E:\WINDOWS\system32\LPK.DLL
    0x74ae0000 - 0x74b45000  E:\WINDOWS\system32\USP10.dll
    0x7c340000 - 0x7c396000  D:\founder\jdk1.6\jre\bin\msvcr71.dll
    0x6d8b0000 - 0x6db06000  D:\founder\jdk1.6\jre\bin\client\jvm.dll
    0x769e0000 - 0x76a0a000  E:\WINDOWS\system32\WINMM.dll
    0x6d340000 - 0x6d348000  D:\founder\jdk1.6\jre\bin\hpi.dll
    0x76ab0000 - 0x76abb000  E:\WINDOWS\system32\PSAPI.DLL
    0x6d860000 - 0x6d86c000  D:\founder\jdk1.6\jre\bin\verify.dll
    0x6d3e0000 - 0x6d3ff000  D:\founder\jdk1.6\jre\bin\java.dll
    0x6d8a0000 - 0x6d8af000  D:\founder\jdk1.6\jre\bin\zip.dll
    0x68000000 - 0x68035000  E:\WINDOWS\system32\rsaenh.dll
    0x77b70000 - 0x77bca000  E:\WINDOWS\system32\msvcrt.dll
    0x75870000 - 0x7592d000  E:\WINDOWS\system32\USERENV.dll
    0x71ba0000 - 0x71bf7000  E:\WINDOWS\system32\netapi32.dll
    0x6d6c0000 - 0x6d6d3000  D:\founder\jdk1.6\jre\bin\net.dll
    0x71b60000 - 0x71b77000  E:\WINDOWS\system32\WS2_32.dll
    0x71b50000 - 0x71b58000  E:\WINDOWS\system32\WS2HELP.dll
    0x55600000 - 0x55635000  E:\Program Files\Microsoft Firewall Client 2004\FwcWsp.dll
    0x775f0000 - 0x7767b000  E:\WINDOWS\system32\OLEAUT32.dll
    0x774b0000 - 0x775e9000  E:\WINDOWS\system32\ole32.dll
    0x71a80000 - 0x71ac0000  E:\WINDOWS\System32\mswsock.dll
    0x76e30000 - 0x76e5b000  E:\WINDOWS\system32\DNSAPI.dll
    0x76ed0000 - 0x76ed7000  E:\WINDOWS\System32\winrnr.dll
    0x76e70000 - 0x76e9e000  E:\WINDOWS\system32\WLDAP32.dll
    0x69660000 - 0x696b7000  E:\WINDOWS\system32\hnetcfg.dll
    0x77eb0000 - 0x77f02000  E:\WINDOWS\system32\SHLWAPI.dll
    0x77cd0000 - 0x77dd3000  E:\WINDOWS\WinSxS\x86_Microsoft.Windows.Common-Controls_6595b64144ccf1df_6.0.3790.3959_x-ww_D8713E55\comctl32.dll
    0x71a40000 - 0x71a48000  E:\WINDOWS\System32\wshtcpip.dll
    0x76ee0000 - 0x76ee5000  E:\WINDOWS\system32\rasadhlp.dll
    0x10000000 - 0x10052000  E:\Documents and Settings\Administrator\Local Settings\Temp\jna6656590331965838877.tmp
    0x0b370000 - 0x0b4a4000  E:\WINDOWS\system32\CEBX2Image.dll
    0x0b4b0000 - 0x0b75e000  E:\WINDOWS\system32\XEKrnl.dll
    0x12000000 - 0x121e3000  E:\WINDOWS\system32\xerces-c_3_0.dll
    0x76170000 - 0x76175000  E:\WINDOWS\system32\MSIMG32.dll
    0x0b780000 - 0x0b7fb000  E:\WINDOWS\system32\MercProcessor.dll
    0x4c620000 - 0x4c7c7000  E:\WINDOWS\WinSxS\x86_Microsoft.Windows.GdiPlus_6595b64144ccf1df_1.0.3790.3959_x-ww_8251BDDE\gdiplus.dllVM Arguments:
    jvm_args: -Xbootclasspath/a:F:\MyEclipse\myeclipse\eclipse\plugins\com.genuitec.eclipse.j2eedt.core_6.5.0.zmyeclipse650200806\data\libraryset\EE_5\javaee.jar;F:\MyEclipse\myeclipse\eclipse\plugins\com.genuitec.eclipse.j2eedt.core_6.5.0.zmyeclipse650200806\data\libraryset\EE_5\jsf-impl.jar;F:\MyEclipse\myeclipse\eclipse\plugins\com.genuitec.eclipse.j2eedt.core_6.5.0.zmyeclipse650200806\data\libraryset\EE_5\jsf-api.jar;F:\MyEclipse\myeclipse\eclipse\plugins\com.genuitec.eclipse.j2eedt.core_6.5.0.zmyeclipse650200806\data\libraryset\EE_5\jstl-1.2.jar 
    java_command: com.JnaTest1
    Launcher Type: SUN_STANDARDEnvironment Variables:
    JAVA_HOME=D:\founder\jdk1.6
    PATH=D:\founder\jdk1.6\bin;E:\WINDOWS\system32;E:\WINDOWS;E:\WINDOWS\System32\Wbem;E:\WINDOWS\system32\WindowsPowerShell\v1.0;E:\Program Files\Microsoft SQL Server\100\Tools\Binn\;E:\Program Files\Microsoft SQL Server\100\DTS\Binn\;E:\Program Files\Microsoft SQL Server\100\Tools\Binn\VSShell\Common7\IDE\;E:\Program Files\Microsoft Visual Studio 9.0\Common7\IDE\PrivateAssemblies\;E:\Program Files\Microsoft SQL Server\90\Tools\binn\
    USERNAME=Administrator
    OS=Windows_NT
    PROCESSOR_IDENTIFIER=x86 Family 6 Model 23 Stepping 10, GenuineIntel---------------  S Y S T E M  ---------------OS: Windows Server 2003 family Build 3790 Service Pack 2CPU:total 4 (4 cores per cpu, 1 threads per core) family 6 model 7 stepping 10, cmov, cx8, fxsr, mmx, sse, sse2, sse3, ssse3Memory: 4k page, physical 2097151k(1154672k free), swap 4194303k(3318988k free)vm_info: Java HotSpot(TM) Client VM (11.2-b01) for windows-x86 JRE (1.6.0_12-b04), built on Jan 17 2009 09:57:14 by "java_re" with MS VC++ 7.1time: Wed Jun 29 14:24:42 2011
    elapsed time: 0 seconds
      

  3.   

    我也遇到这问题,未解决。求高人解决。
    c++代码:#define MYLIBAPI  extern  "C" __declspec(dllexport)MYLIBAPI int sayStr(string strBuf,int Ito);int sayStr(string strBuf,int Ito)
    {
    Ito = 2;
    string str = "abcde";
    strBuf = str.c_str();
    return 0;
    }java代码:public class TestDll1Service { public interface TestDll1 extends Library {

    TestDll1 INSTANCE = (TestDll1)Native.loadLibrary("TestDll1",TestDll1.class);
    public int sayStr(char* szBufv,int Ito);
    } public static void main(String[] args) {
    byte sz[] = new byte[8];
    int Ito = 0;
         int zdps = TestDll1.INSTANCE.sayStr(sz,Ito);
         System.out.println("ito:" + Ito);
    }
    }这段代码的意图是想从C++的Ito:2传给java中的Ito ,结果java中的Ito还是为0;即输出参数还是0错误提示:
    An unexpected error has been detected by Java Runtime Environment:
    #
    #  EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x00000000, pid=4876, tid=2164
    #
    # Java VM: Java HotSpot(TM) Client VM (11.0-b15 mixed mode windows-x86)
    # Problematic frame:
    # C  0x00000000
    #......