我现在利用JAVA语言,通过JNI技术调用一个C++写的DLL(我叫A),全名是:CEDLL.dll,这个DLL A函数原型是:
int EnData(unsigned char * DataBuf, int DataLen, unsigned char * OutBuf, int OutLen)
int DeData(unsigned char * DataBuf, int DataLen, unsigned char * OutBuf, int OutLen)
因为不能直接调用这个DLL A,所以我用C++写了一个外套DLL B(索性叫B),来调用A中的这两个函数:
,其中DLL B已经生成,其他头文件也正常生成,我用JAVA写了方法调用也成功,但是现在问题来了,
因为我这个程序需要24小时运行,但是只要跑上几个小时,JVM系统就会崩溃,
现在,我怀疑,可能我带入的参数导致DLL A(CEDLL.DLL)溢出了,即如下两个函数的参数带入有问题:
int EnData(unsigned char * DataBuf, int DataLen, unsigned char * OutBuf, int OutLen)
int DeData(unsigned char * DataBuf, int DataLen, unsigned char * OutBuf, int OutLen)
但我问DLL开发商,说,如果类似OutLen这种参数长度不够,也会做判断,应该不会DLL调用崩溃,
现在我很困惑,不知道到底是参数调用错了,还是我以上外套DLL B写错了,或者是JVM环境配置不合适?
为什么不定时会导致JVM崩溃,
还希望有经验的高手朋友多多指教!!!!

解决方案 »

  1.   

    如下是DLL B(外套DLL)内容:
    #include <stdio.h>   
    #include <windows.h>
    #include "TestCEDLL.h"
    #include "jni.h"typedef UINT (CALLBACK* ENDATA_DLL)(char *);   
    typedef UINT (CALLBACK* DEDATA_DLL)(char *); static void HandleError(JNIEnv *jEnv)
    {
    jclass newExcCls;

    (*jEnv)->ExceptionDescribe(jEnv);
    (*jEnv)->ExceptionClear(jEnv);

    newExcCls = (*jEnv)->FindClass(jEnv,"java/lang/Exception");
    if (newExcCls == 0) {
    return -1;
    }

    (*jEnv)->ThrowNew(jEnv,newExcCls,"thrown from c plus code");
    }JNIEXPORT jint JNICALL Java_TestCEDLL_EnData
    (JNIEnv * jEnv, jobject this, jbyteArray dataBuf,jint dataLen,jbyteArray outBuf,jint outLen) 
    {
    HINSTANCE hDLL; 
    ENDATA_DLL endata_dll;
    jthrowable exception;
    int flag = 1;
    int ennum = -1;
    char * databuf;
    char * outbuf;
    jstring ret;
    hDLL = LoadLibrary("CEDLL");
    exception = (*jEnv)->ExceptionOccurred(jEnv);
    if (exception) {
    HandleError(jEnv);
    }
    endata_dll = (ENDATA_DLL)GetProcAddress(hDLL,"EnData");
    exception = (*jEnv)->ExceptionOccurred(jEnv);
    if (exception) {
    HandleError(jEnv);
    }
        if (!endata_dll)   
        {   
    FreeLibrary(hDLL);     
    printf("EnData dll link failed\n");   
            return "";   
        } else {
    databuf = (char*)(*jEnv)->GetByteArrayElements(jEnv, dataBuf,NULL);
    outbuf = (char*)(*jEnv)->GetByteArrayElements(jEnv, outBuf,NULL);
    ennum = endata_dll(databuf,dataLen,outbuf,outLen);
    exception = (*jEnv)->ExceptionOccurred(jEnv);
    if (exception) {
    HandleError(jEnv);
    }
    printf("EnData success invoke!\n");
    printf("databuf= %s\n",databuf);
    printf("outbuf= %s\n",outbuf);
    printf("ennum= %d\n",ennum);
    (*jEnv)->ReleaseByteArrayElements(jEnv,dataBuf,databuf,0);
    (*jEnv)->ReleaseByteArrayElements(jEnv,outBuf,outbuf,0);
    FreeLibrary(hDLL); 
    return ennum;
    }}JNIEXPORT jint JNICALL Java_TestCEDLL_DeData
    (JNIEnv * jEnv, jobject this, jbyteArray outBuf,jint outLen,jbyteArray dataBuf,jint dataLen) 
    {
    HINSTANCE hDLL; 
    DEDATA_DLL Dedata_dll;
    jthrowable exception;
    int flag = 1;
    int ennum = -1;
    char * databuf;
    char * outbuf;
    jstring ret;
    hDLL = LoadLibrary("CEDLL");
    exception = (*jEnv)->ExceptionOccurred(jEnv);
    if (exception) {
    HandleError(jEnv);
    }
    Dedata_dll = (ENDATA_DLL)GetProcAddress(hDLL,"DeData");
    exception = (*jEnv)->ExceptionOccurred(jEnv);
    if (exception) {
    HandleError(jEnv);
    }
        if (!Dedata_dll)   
        {   
    FreeLibrary(hDLL);     
    printf("DeData dll link failed\n");   
            return "";   
        } else {
    databuf = (char*)(*jEnv)->GetByteArrayElements(jEnv, dataBuf,NULL);
    outbuf = (char*)(*jEnv)->GetByteArrayElements(jEnv, outBuf,NULL);
    ennum = Dedata_dll(outbuf,outLen,databuf,dataLen);
    exception = (*jEnv)->ExceptionOccurred(jEnv);
    if (exception) {
    HandleError(jEnv);
    }
    printf("DeData success invoke!\n");
    printf("databuf= %s\n",databuf);
    printf("outbuf= %s\n",outbuf);
    printf("ennum= %d\n",ennum);
    (*jEnv)->ReleaseByteArrayElements(jEnv,dataBuf,databuf,0);
    (*jEnv)->ReleaseByteArrayElements(jEnv,outBuf,outbuf,0);
    FreeLibrary(hDLL); 
    return ennum;
    }
    }
      

  2.   

    以下是JVM异常日志记录的原因:
    #
    # An unexpected error has been detected by HotSpot Virtual Machine:
    #  EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x4a749313, pid=3424, tid=868
    # Java VM: Java HotSpot(TM) Client VM (1.5.0_05-b05 mixed mode)
    # Problematic frame:
    # C  [CEDLL.dll+0x9313]---------------  T H R E A D  ---------------
    Current thread (0x4a016010):  JavaThread "pool-1-thread-8" [_thread_in_native, id=868]siginfo: ExceptionCode=0xc0000005, writing address 0x49cb8000Registers:
    EAX=0x4cb748f9, EBX=0x43be2598, ECX=0x3fffff35, EDX=0x00000001
    ESP=0x4cb70874, EBP=0x4cb7087c, ESI=0x4cb74c24, EDI=0x49cb8000
    EIP=0x4a749313, EFLAGS=0x00010202Top of Stack: (sp=0x4cb70874)
    0x4cb70874:   43be2598 4cb9f828 4cb9fa8c 4a74270a
    0x4cb70884:   49cb7cd8 4cb748fc fffffffd 4a016010
    0x4cb70894:   43be2598 43be2598 cccccccc cccccccc
    0x4cb708a4:   cccccccc cccccccc cccccccc cccccccc
    0x4cb708b4:   cccccccc cccccccc cccccccc cccccccc
    0x4cb708c4:   cccccccc cccccccc cccccccc cccccccc
    0x4cb708d4:   cccccccc cccccccc cccccccc cccccccc
    0x4cb708e4:   cccccccc cccccccc cccccccc cccccccc Instructions: (pc=0x4a749313)
    0x4a749303:   00 00 00 75 14 c1 e9 02 83 e2 03 83 f9 08 72 29
    0x4a749313:   f3 a5 ff 24 95 28 94 74 4a 8b c7 ba 03 00 00 00 
    Stack: [0x4c9a0000,0x4cba0000),  sp=0x4cb70874,  free space=1858k
    Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code)
    C  [CEDLL.dll+0x9313]Java frames: (J=compiled Java code, j=interpreted, Vv=VM code)
    j  TestCEDLL.DeData([BI[BI)I+0
    j  com.clou.cl7100.fep.util.CompressAndDecompress.Dedata_java([BI[BI)I+9
    J  com.clou.cl7100.fep.termidispserver.DispatchDataGeLoadCtrl.dispatch(Lcom/clou/cl7100/fep/util/TransTermiData;)V
    v  ~RuntimeStub::alignment_frame_return Runtime1 stub
    j  com.clou.cl7100.fep.termidispserver.DispatchDataGeLoadCtrl.run()V+59
    j  java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Ljava/lang/Runnable;)V+44
    j  java.util.concurrent.ThreadPoolExecutor$Worker.run()V+28
    j  java.lang.Thread.run()V+11
    v  ~StubRoutines::call_stub---------------  P R O C E S S  ---------------Java Threads: ( => current thread )
      0x4a0818e8 JavaThread "TimeoutFactory" daemon [_thread_blocked, id=2996]
      0x4a044780 JavaThread "ExecuteThread: '0' for queue: 'JmsAsyncQueue'" daemon [_thread_blocked, id=312]
      0x49f397e0 JavaThread "Timer-1" daemon [_thread_blocked, id=3072]
      0x4a021660 JavaThread "pool-1-thread-11" [_thread_blocked, id=3284]
      0x4a020620 JavaThread "pool-1-thread-10" [_thread_blocked, id=3744]
      0x4a0176e0 JavaThread "pool-1-thread-9" [_thread_blocked, id=708]
    =>0x4a016010 JavaThread "pool-1-thread-8" [_thread_in_native, id=868]
      0x4a00f8f0 JavaThread "pool-1-thread-7" [_thread_in_native, id=3776]
      0x4a00ec58 JavaThread "pool-1-thread-6" [_thread_in_native, id=2884]
      0x4a014140 JavaThread "pool-1-thread-5" [_thread_blocked, id=3524]
      0x4a0135e8 JavaThread "pool-1-thread-4" [_thread_blocked, id=2560]
      0x4a010d48 JavaThread "pool-1-thread-3" [_thread_blocked, id=3436]
      0x4a0103c8 JavaThread "pool-1-thread-2" [_thread_blocked, id=4088]
      0x4a014e38 JavaThread "pool-1-thread-1" [_thread_blocked, id=640]
      0x49fd0950 JavaThread "weblogic.transaction.TxTimer: '1'" daemon [_thread_blocked, id=2648]
      0x49fefb30 JavaThread "Timer-0" daemon [_thread_blocked, id=2280]
      0x49fb9410 JavaThread "weblogic.timers.TimerThread" daemon [_thread_blocked, id=960]
      0x49fa1d08 JavaThread "ExecuteThread: '4' for queue: 'default'" daemon [_thread_blocked, id=3968]
      0x49fc3d08 JavaThread "ExecuteThread: '3' for queue: 'default'" daemon [_thread_blocked, id=4076]
      0x49fc3b88 JavaThread "ExecuteThread: '2' for queue: 'default'" daemon [_thread_blocked, id=3716]
      0x49ec5b10 JavaThread "ExecuteThread: '1' for queue: 'default'" daemon [_thread_in_native, id=3288]
      0x49fbc8a8 JavaThread "ExecuteThread: '0' for queue: 'default'" daemon [_thread_blocked, id=3452]
      0x49bfa780 JavaThread "Thread-0" [_thread_blocked, id=1012]
      0x00b4d5f8 JavaThread "Low Memory Detector" daemon [_thread_blocked, id=3212]
      0x00b4c2f8 JavaThread "CompilerThread0" daemon [_thread_blocked, id=3304]
      0x00b4b540 JavaThread "Signal Dispatcher" daemon [_thread_blocked, id=3216]
      0x00b3e0a0 JavaThread "Finalizer" daemon [_thread_blocked, id=3648]
      0x00b3cc08 JavaThread "Reference Handler" daemon [_thread_blocked, id=2672]
      0x009cc0d0 JavaThread "main" [_thread_in_native, id=3064]
      

  3.   

    接上:
    Other Threads:
      0x00b38ab0 VMThread [id=3168]
      0x00b4e910 WatcherThread [id=524]VM state:not at safepoint (normal execution)VM Mutex/Monitor currently owned by a thread: NoneHeap
     def new generation   total 36352K, used 31180K [0x031a0000, 0x05910000, 0x08060000)
      eden space 32320K,  92% used [0x031a0000, 0x04ef2e50, 0x05130000)
      from space 4032K,  28% used [0x05520000, 0x05640458, 0x05910000)
      to   space 4032K,   0% used [0x05130000, 0x05130000, 0x05520000)
     tenured generation   total 483968K, used 8961K [0x08060000, 0x25900000, 0x431a0000)
       the space 483968K,   1% used [0x08060000, 0x08920710, 0x08920800, 0x25900000)
     compacting perm gen  total 13312K, used 13245K [0x431a0000, 0x43ea0000, 0x471a0000)
       the space 13312K,  99% used [0x431a0000, 0x43e8f760, 0x43e8f800, 0x43ea0000)
    No shared spaces configured.Dynamic libraries:
    0x00400000 - 0x00439000  D:\前置机\ForePc\ForePc.exe
    0x77f30000 - 0x77ffa000  C:\WINDOWS\system32\ntdll.dll
    0x77e10000 - 0x77f2d000  C:\WINDOWS\system32\kernel32.dll
    0x77d60000 - 0x77e00000  C:\WINDOWS\system32\ADVAPI32.DLL
    0x77c20000 - 0x77cc4000  C:\WINDOWS\system32\RPCRT4.dll
    0x77bd0000 - 0x77c14000  C:\WINDOWS\system32\GDI32.dll
    0x77cd0000 - 0x77d5e000  C:\WINDOWS\system32\USER32.dll
    0x77b70000 - 0x77bc4000  C:\WINDOWS\system32\msvcrt.dll
    0x77370000 - 0x77b2b000  C:\WINDOWS\system32\SHELL32.DLL
    0x77280000 - 0x772c9000  C:\WINDOWS\system32\SHLWAPI.dll
    0x76180000 - 0x7619d000  C:\WINDOWS\system32\IMM32.DLL
    0x63090000 - 0x63099000  C:\WINDOWS\system32\LPK.DLL
    0x72ee0000 - 0x72f3e000  C:\WINDOWS\system32\USP10.dll
    0x70ad0000 - 0x70bb6000  C:\WINDOWS\WinSxS\x86_Microsoft.Windows.Common-Controls_6595b64144ccf1df_6.0.100.0_x-ww_8417450B\comctl32.dll
    0x6d640000 - 0x6d7cc000  c:\program files\java\jre1.5.0_05\bin\client\jvm.dll
    0x769e0000 - 0x76a09000  C:\WINDOWS\system32\WINMM.dll
    0x71b20000 - 0x71b28000  C:\WINDOWS\system32\rdpsnd.dll
    0x76150000 - 0x76160000  C:\WINDOWS\system32\WINSTA.dll
    0x71ba0000 - 0x71bf3000  C:\WINDOWS\system32\NETAPI32.dll
    0x76ab0000 - 0x76abb000  C:\WINDOWS\system32\PSAPI.DLL
    0x6d280000 - 0x6d288000  c:\program files\java\jre1.5.0_05\bin\hpi.dll
    0x6d610000 - 0x6d61c000  c:\program files\java\jre1.5.0_05\bin\verify.dll
    0x6d300000 - 0x6d31d000  c:\program files\java\jre1.5.0_05\bin\java.dll
    0x6d630000 - 0x6d63f000  c:\program files\java\jre1.5.0_05\bin\zip.dll
    0x01080000 - 0x010d0000  D:\前置机\ForePc\swt-win32-3139.dll
    0x77150000 - 0x77274000  C:\WINDOWS\system32\ole32.dll
    0x70bc0000 - 0x70c50000  C:\WINDOWS\WinSxS\x86_Microsoft.Windows.Common-Controls_6595b64144ccf1df_5.82.0.0_x-ww_8A69BA05\COMCTL32.dll
    0x761a0000 - 0x761e5000  C:\WINDOWS\system32\comdlg32.dll
    0x770d0000 - 0x7714d000  C:\WINDOWS\system32\OLEAUT32.dll
    0x74430000 - 0x7447b000  C:\WINDOWS\system32\MSCTF.dll
    0x75d60000 - 0x75d82000  C:\WINDOWS\system32\apphelp.dll
    0x01140000 - 0x0116b000  C:\WINDOWS\system32\msctfime.ime
    0x749c0000 - 0x749ef000  C:\WINDOWS\system32\oleacc.dll
    0x780c0000 - 0x78121000  C:\WINDOWS\system32\MSVCP60.dll
    0x74400000 - 0x74428000  C:\WINDOWS\system32\Msimtf.dll
    0x77b60000 - 0x77b68000  C:\WINDOWS\system32\VERSION.dll
    0x6d4c0000 - 0x6d4d3000  C:\Program Files\Java\jre1.5.0_05\bin\net.dll
    0x71b60000 - 0x71b78000  C:\WINDOWS\system32\WS2_32.dll
    0x71b50000 - 0x71b58000  C:\WINDOWS\system32\WS2HELP.dll
    0x71a80000 - 0x71ac2000  C:\WINDOWS\System32\mswsock.dll
    0x76e30000 - 0x76e58000  C:\WINDOWS\system32\DNSAPI.dll
    0x76ed0000 - 0x76ed7000  C:\WINDOWS\System32\winrnr.dll
    0x76e70000 - 0x76e9f000  C:\WINDOWS\system32\WLDAP32.dll
    0x76ee0000 - 0x76ee5000  C:\WINDOWS\system32\rasadhlp.dll
    0x4a510000 - 0x4a53d000  C:\WINDOWS\system32\rsaenh.dll
    0x75870000 - 0x75925000  C:\WINDOWS\system32\USERENV.dll
    0x71a40000 - 0x71a48000  C:\WINDOWS\System32\wshtcpip.dll
    0x6d4e0000 - 0x6d4e9000  C:\Program Files\Java\jre1.5.0_05\bin\nio.dll
    0x4a580000 - 0x4a58b000  D:\前置机\ForePc\CEDLLWRAPPER.dll
    0x4a740000 - 0x4a785000  D:\前置机\ForePc\CEDLL.dllVM Arguments:
    jvm_args: -Dexe4j.commFile=C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\e4jA4.tmp -Dexe4j.moduleName=D:\前置机\ForePc\ForePc.exe -Xms512m -Xmx1024m - Xss10000k
    java_command: <unknown>Environment Variables:
    PATH=C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\Program Files\Java\jdk1.5.0_05\bin;D:\clouTest\FPC;C:\Program Files\Microsoft Visual Studio\Common\Tools\WinNT;C:\Program Files\Microsoft Visual Studio\Common\MSDev98\Bin;C:\Program Files\Microsoft Visual Studio\Common\Tools;C:\Program Files\Microsoft Visual Studio\VC98\bin
    USERNAME=Administrator
    OS=Windows_NT
    PROCESSOR_IDENTIFIER=x86 Family 15 Model 4 Stepping 3, GenuineIntel---------------  S Y S T E M  ---------------OS: Windows Server 2003 family Build 3790 CPU:total 4 family 15, cmov, cx8, fxsr, mmx, sse, sse2, htMemory: 4k page, physical 2097151k(2097151k free), swap 4194303k(4103340k free)vm_info: Java HotSpot(TM) Client VM (1.5.0_05-b05) for windows-x86, built on Aug 26 2005 15:36:02 by "java_re" with MS VC++ 6.0
      

  4.   

    好长啊,看不出来,
    #  EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x4a749313, pid=3424, tid=868
    # Java VM: Java HotSpot(TM) Client VM (1.5.0_05-b05 mixed mode)
    # Problematic frame:
    # C  [CEDLL.dll+0x9313]
    -----------------------------
    上面说明CEDLL访问了一个不可访问的指针(一般是空指针)j  TestCEDLL.DeData([BI[BI)I+0
    请调试CEDLL中的DeData
      

  5.   

    我现在利用JAVA语言,通过JNI技术调用一个C++写的DLL(我叫A),全名是:CEDLL.dll,这个DLL   A函数原型是: 
    int   EnData(unsigned   char   *   DataBuf,   int   DataLen,   unsigned   char   *   OutBuf,   int   OutLen) 
    int   DeData(unsigned   char   *   DataBuf,   int   DataLen,   unsigned   char   *   OutBuf,   int   OutLen) 
    因为不能直接调用这个DLL   A,所以我用C++写了一个外套DLL   B(索性叫B),来调用A中的这两个函数: 
    ,其中DLL   B已经生成,其他头文件也正常生成,我用JAVA写了方法调用也成功,但是现在问题来了, 
    因为我这个程序需要24小时运行,但是只要跑上几个小时,JVM系统就会崩溃, 
    现在,我怀疑,可能我带入的参数导致DLL   A(CEDLL.DLL)溢出了,即如下两个函数的参数带入有问题: 
    int   EnData(unsigned   char   *   DataBuf,   int   DataLen,   unsigned   char   *   OutBuf,   int   OutLen) 
    int   DeData(unsigned   char   *   DataBuf,   int   DataLen,   unsigned   char   *   OutBuf,   int   OutLen) 
    但我问DLL开发商,说,如果类似OutLen这种参数长度不够,也会做判断,应该不会DLL调用崩溃, 
    现在我很困惑,不知道到底是参数调用错了,还是我以上外套DLL   B写错了,或者是JVM环境配置不合适? 
    为什么不定时会导致JVM崩溃, 
    还希望有经验的高手朋友多多指教!!!!
      

  6.   

    C++的程序是你写的吗?这种问题需要调试才可能解决。
    如果不会调试的话,不要在java里问,最好找个身边会调试c/c++的人教你。