[已解决]请问谁遇到过Java Jni调用VC编译的Dll里调dll的内存访问异常错误?多方查找无解,特来请教....

好几天前遇到的一个问题,自己找了几天资料还是解决不了,特来向仰慕已久的JavaEyer们请教一下: :D

公司要在Java项目中复用原来的DLL代码,其中有涉及网络加密及通讯的功能,
故我使用Jni写了一个Java类,并通过VC++实现相应的本地代码,编译成DLL,在该DLL中去调用公司原来的DLL组件并进行简要处理后传回Java,目前遇到一个可重现,但未找到解决方法的问题:

在Java中调用Jni的DLL调用原公司DLL接收数据时,当接收到的数据超过一定的长度时,程序返回时就会出错,抛出虚拟机的访问异常,该异常是从DLL中抛出的,但接收的数据长度小于一定时不会有问题,超过一定长度时就出错,而接收数据的缓冲区都是预先设定好的。

JNI代码如下:
[code]
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;
}
[/code]

在网上搜索时有查到一个文章说,使用Java JNI调用VC编译的a.DLL,同时该a.DLL再调用另外一个VC编译的b.DLL并在a.DLL中释放b.DLL中的资源会抛出访问异常,只是根据这个信息一直找不到类似的资料。

:evil: 不知各位是否有人遇到过?谢谢。

原来使用new的这种方式来开字符数组缓冲区,但一调用delete立刻就抛出异常:
[code]
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;
}
[/code]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值