<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>DT1</title>
    <description></description>
    <link>http://dt1.javaeye.com</link>
    <language>UTF-8</language>
    <copyright>Copyright 2003-2008, JavaEye.com</copyright>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <generator>JavaEye - 做最棒的软件开发交流社区</generator>
      <item>
        <title>[已解决]请问谁遇到过Java Jni调用VC编译的Dll里调dll的内存访问异常错误？多方查找无解，特来请教.</title>
        <author>DT1</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://dt1.javaeye.com">DT1</a>&nbsp;
          链接：<a href="http://dt1.javaeye.com/blog/99788" style="color:red;">http://dt1.javaeye.com/blog/99788</a>&nbsp;
          发表时间: 2007年07月10日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          好几天前遇到的一个问题，自己找了几天资料还是解决不了，特来向仰慕已久的JavaEyer们请教一下： <img src="/images/smiles/icon_biggrin.gif"/><br /><br />公司要在Java项目中复用原来的DLL代码，其中有涉及网络加密及通讯的功能，<br />故我使用Jni写了一个Java类，并通过VC++实现相应的本地代码，编译成DLL，在该DLL中去调用公司原来的DLL组件并进行简要处理后传回Java，目前遇到一个可重现，但未找到解决方法的问题：<br /><br />在Java中调用Jni的DLL调用原公司DLL接收数据时，当接收到的数据超过一定的长度时，程序返回时就会出错，抛出虚拟机的访问异常，该异常是从DLL中抛出的，但接收的数据长度小于一定时不会有问题，超过一定长度时就出错，而接收数据的缓冲区都是预先设定好的。<br /><br />JNI代码如下：<br /><pre name="code" class="java">
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;	
}
</pre><br /><br />在网上搜索时有查到一个文章说，使用Java JNI调用VC编译的a.DLL，同时该a.DLL再调用另外一个VC编译的b.DLL并在a.DLL中释放b.DLL中的资源会抛出访问异常，只是根据这个信息一直找不到类似的资料。<br /><br />:evil: 不知各位是否有人遇到过？谢谢。<br /><br />原来使用new的这种方式来开字符数组缓冲区，但一调用delete立刻就抛出异常：<br /><pre name="code" class="java">
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;	
}
</pre>
          <br/>
          <span style="color:red;">
            <a href="http://dt1.javaeye.com/blog/99788#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 10 Jul 2007 14:49:57 +0800</pubDate>
        <link>http://dt1.javaeye.com/blog/99788</link>
        <guid>http://dt1.javaeye.com/blog/99788</guid>
      </item>
  </channel>
</rss>