2007-07-10
[已解决]请问谁遇到过Java Jni调用VC编译的Dll里调dll的内存访问异常错误?多方查找无解,特来请教.
关键字: java jni VC DLL
好几天前遇到的一个问题,自己找了几天资料还是解决不了,特来向仰慕已久的JavaEyer们请教一下:
公司要在Java项目中复用原来的DLL代码,其中有涉及网络加密及通讯的功能,
故我使用Jni写了一个Java类,并通过VC++实现相应的本地代码,编译成DLL,在该DLL中去调用公司原来的DLL组件并进行简要处理后传回Java,目前遇到一个可重现,但未找到解决方法的问题:
在Java中调用Jni的DLL调用原公司DLL接收数据时,当接收到的数据超过一定的长度时,程序返回时就会出错,抛出虚拟机的访问异常,该异常是从DLL中抛出的,但接收的数据长度小于一定时不会有问题,超过一定长度时就出错,而接收数据的缓冲区都是预先设定好的。
JNI代码如下:
在网上搜索时有查到一个文章说,使用Java JNI调用VC编译的a.DLL,同时该a.DLL再调用另外一个VC编译的b.DLL并在a.DLL中释放b.DLL中的资源会抛出访问异常,只是根据这个信息一直找不到类似的资料。
:evil: 不知各位是否有人遇到过?谢谢。
原来使用new的这种方式来开字符数组缓冲区,但一调用delete立刻就抛出异常:
公司要在Java项目中复用原来的DLL代码,其中有涉及网络加密及通讯的功能,
故我使用Jni写了一个Java类,并通过VC++实现相应的本地代码,编译成DLL,在该DLL中去调用公司原来的DLL组件并进行简要处理后传回Java,目前遇到一个可重现,但未找到解决方法的问题:
在Java中调用Jni的DLL调用原公司DLL接收数据时,当接收到的数据超过一定的长度时,程序返回时就会出错,抛出虚拟机的访问异常,该异常是从DLL中抛出的,但接收的数据长度小于一定时不会有问题,超过一定长度时就出错,而接收数据的缓冲区都是预先设定好的。
JNI代码如下:
JNIEXPORT jint JNICALL Java_com_jni_GenDll_receiveData
(JNIEnv *jEnv, jobject jObj, jlong Timer, jbyteArray dataBuf, jint index){
char vbData[MAX_BUF];
long dataLen = -1;
int retCode = -1;
retCode = VB_ReceiveData((long)Timer, vbData, dataLen, index);//调出原有DLL功能并处理
if (dataLen > 0) {
jEnv->SetByteArrayRegion(dataBuf, 0, dataLen, (const signed char*)vbData);
}
return retCode;
}
在网上搜索时有查到一个文章说,使用Java JNI调用VC编译的a.DLL,同时该a.DLL再调用另外一个VC编译的b.DLL并在a.DLL中释放b.DLL中的资源会抛出访问异常,只是根据这个信息一直找不到类似的资料。
:evil: 不知各位是否有人遇到过?谢谢。
原来使用new的这种方式来开字符数组缓冲区,但一调用delete立刻就抛出异常:
JNIEXPORT jint JNICALL Java_com_jni_GenDll_receiveData
(JNIEnv *jEnv, jobject jObj, jlong Timer, jbyteArray dataBuf, jint index){
char* vbData = new char[MAX_BUF];
long dataLen = -1;
int retCode = -1;
retCode = VB_ReceiveData((long)Timer, vbData, dataLen, index);//调出原有DLL功能并处理
if (dataLen > 0) {
jEnv->SetByteArrayRegion(dataBuf, 0, dataLen, (const signed char*)vbData);
}
delete vbData; //调用此句立刻抛出访问异常!!!
return retCode;
}
评论
DT1
2007-07-12
经公司VC老大出马,VC+Java配合调试,目前问题已经解决,原因是在VC中开辟的缓冲区会被Java虚拟机动态整理导致分配的空间不连续,原来指针指向的东西超过一页(4K)后的内存就整到别的地方去了,导致访问超过一页的内存出错,现在使用的方法是在VC中每次操作都新开一个缓冲区,牺牲一定的性能。
DT1
2007-07-11
huangpengxiao 写道
char* vbData = new char[MAX_BUF];
这种似乎也是固定长度的缓存吧?
这种似乎也是固定长度的缓存吧?
对,问题是同样是在同样的程序下,开了这缓存后,只要写到里面的数据没有超过一定的长度程序都正常,而超过一定的长度后都会出错(一定长度是多长,只能大概一个数,几K左右),超过几十个byte就出错了,很晕....
huangpengxiao
2007-07-10
char* vbData = new char[MAX_BUF];
这种似乎也是固定长度的缓存吧?
这种似乎也是固定长度的缓存吧?
- 浏览: 1428 次

- 详细资料
搜索本博客
最近加入圈子
最新评论
-
[已解决]请问谁遇到过Ja ...
经公司VC老大出马,VC+Java配合调试,目前问题已经解决,原因是在VC中开辟 ...
-- by DT1 -
[已解决]请问谁遇到过Ja ...
huangpengxiao 写道char* vbData = new char[ ...
-- by DT1 -
[已解决]请问谁遇到过Ja ...
char* vbData = new char[MAX_BUF]; 这种似乎也是 ...
-- by huangpengxiao






评论排行榜