一个关于JNI调用DLL导致JVM崩溃的问题!!!

hunterzy031 2007-05-25 10:49:13
我现在利用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崩溃,
还希望有经验的高手朋友多多指教!!!!
...全文
851 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
taolei 2008-04-02
  • 打赏
  • 举报
回复
C++的程序是你写的吗?这种问题需要调试才可能解决。
如果不会调试的话,不要在java里问,最好找个身边会调试c/c++的人教你。
chenhongxin 2008-03-31
  • 打赏
  • 举报
回复
我现在利用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崩溃,
还希望有经验的高手朋友多多指教!!!!
chensjmail 2008-03-31
  • 打赏
  • 举报
回复
C的代码中有错误,
simoncj83 2008-03-30
  • 打赏
  • 举报
回复
我也遇到了一个类似的问题
进行这种调用时不时的出现了崩溃
输入参数,我也大概打印了一下,好像没有异常
楼主如果知道了原因还望告知一下。
谢谢。
哪位大侠了解也帮忙看看啊?

谢谢。
bigc2000 2007-05-28
  • 打赏
  • 举报
回复
好长啊,看不出来,
# 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
hunterzy031 2007-05-25
  • 打赏
  • 举报
回复
接上:
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: None

Heap
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.dll

VM 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, ht

Memory: 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
hunterzy031 2007-05-25
  • 打赏
  • 举报
回复
以下是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 0x49cb8000

Registers:
EAX=0x4cb748f9, EBX=0x43be2598, ECX=0x3fffff35, EDX=0x00000001
ESP=0x4cb70874, EBP=0x4cb7087c, ESI=0x4cb74c24, EDI=0x49cb8000
EIP=0x4a749313, EFLAGS=0x00010202

Top 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]
hunterzy031 2007-05-25
  • 打赏
  • 举报
回复
如下是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;
}
}

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧