`
DT1
  • 浏览: 67131 次
  • 性别: Icon_minigender_1
  • 来自: 福州
社区版块
存档分类
最新评论

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

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

公司要在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;	
}
分享到:
评论
3 楼 DT1 2007-07-12  
经公司VC老大出马,VC+Java配合调试,目前问题已经解决,原因是在VC中开辟的缓冲区会被Java虚拟机动态整理导致分配的空间不连续,原来指针指向的东西超过一页(4K)后的内存就整到别的地方去了,导致访问超过一页的内存出错,现在使用的方法是在VC中每次操作都新开一个缓冲区,牺牲一定的性能。
2 楼 DT1 2007-07-11  
huangpengxiao 写道
char* vbData = new char[MAX_BUF];
这种似乎也是固定长度的缓存吧?


对,问题是同样是在同样的程序下,开了这缓存后,只要写到里面的数据没有超过一定的长度程序都正常,而超过一定的长度后都会出错(一定长度是多长,只能大概一个数,几K左右),超过几十个byte就出错了,很晕....
1 楼 huangpengxiao 2007-07-10  
char* vbData = new char[MAX_BUF];
这种似乎也是固定长度的缓存吧?

相关推荐

    JAVA JNI调用DLL完整步骤

    总结,Java调用DLL的完整步骤包括:定义Java的`native`方法,使用`javah`生成头文件,编写C/C++ DLL代码,编译DLL,最后在Java程序中调用。这个过程可能需要对JNI规范有深入理解,以及一定的C/C++编程基础。通过熟练...

    java调用vc的dll

    本文将深入探讨如何在Java中调用VC编译的DLL,并提供相关知识点的详细解释。 1. **JNI(Java Native Interface)** Java Native Interface是Java平台标准版(Java SE)的一部分,允许Java代码和其他语言写的代码...

    Java JNI调用DLL方法

    在本案例中,我们讨论的是如何使用Java JNI调用一个名为"AlarmTTS"的VC(Visual C++)动态链接库(DLL)并进行调试。 首先,我们需要了解Java部分的代码。`CallAlarmTTSDll`类是Java程序的核心,它定义了三个本地...

    jni.rar,Java调用VC编译dll接口源代码

    综上所述,"jni.rar"提供了学习和实践Java通过JNI调用C++编译的DLL接口的实例。通过研究这个压缩包中的源代码,开发者可以了解如何在Java中声明和使用本地方法,以及如何在C++中实现这些方法,从而提升Java应用的...

    JNI DEMO:java jni技术 调用 c/c++ 的dll

    JNI(Java Native Interface)是Java平台的标准组成部分,它允许Java代码和其他语言写的代码进行交互。JNI在许多场景下非常有用,比如当需要调用已有的C/C++库或者需要利用硬件特性时。在这个"JNI DEMO"中,我们将...

    JNI实现的DEMO Java调用VC编写的DLL,对应于Linux .SO

    标题中的“JNI实现的DEMO Java调用VC编写的DLL,对应于Linux .SO”指的是一个使用Java Native Interface (JNI) 技术的示例,该示例展示了如何在Java程序中调用由Visual C++ (VC) 编译生成的动态链接库(DLL) 文件,...

    JNI_Demo.rar_DEMO_JNI DEMO_jni c_jni dll_vc6 dll

    总结起来,"JNI_Demo.rar"是一个关于如何在Java程序中使用JNI调用由VC6.0生成的DLL的教程。这个DEMO通过具体的代码示例展示了JNI的工作原理和实现过程,对于学习和理解JNI技术具有很好的参考价值。

    Java调用VC DLL实现串口GPS的访问.pdf

    为解决这个问题,Java提供了调用本地已编译的函数库的方法,即使用JNI技术来调用VC++编写的DLL。 JNI技术是实现跨平台开发和与其他高级语言通信的良好工具。使用JNI技术可以轻松地访问VC++编写的DLL,避免了Jawin和...

    Java通过VC2010创建dll并调用

    ### Java通过VC2010创建DLL并调用 #### 一、概述 在软件开发过程中,有时我们需要在Java程序中调用C/C++代码,这种情况通常发生在性能要求较高或已有现成C/C++库的情况下。Java提供了JNI(Java Native Interface)...

    CVI调用VC编写的Dll文件.pdf

    不过这些语言的调用机制和C/C++略有不同,例如在Java中需要使用JNI(Java Native Interface)来调用本地方法,在C#中则使用P/Invoke,而Matlab则使用其自身的DLL调用方法。在调用过程中,需要注意数据类型和内存管理...

    JNA.jar-JNative.jar-dll创建-JAVA调用-VC调用

    标题中的“JNA.jar-JNative.jar-dll创建-JAVA调用-VC调用”涉及到的是Java平台下通过JNI(Java Native Interface)的两种实现方式,JNA(Java Native Access)和JNative,来与C/C++编写的动态链接库(DLL)进行交互...

    java使用JNI调用C++动态链接库(初学必备)

    Java 使用 JNI(Java Native Interface)调用 C++动态链接库是一种常见的技术,它允许 Java 代码与本地 C 或 C++代码交互,以利用 C++的高性能特性或利用已有的 C++库。以下是对标题和描述中涉及的知识点的详细解释...

    JNA.jar-JNative.jar-jinvoke.jar-dll创建-JAVA调用-VC调用

    这个压缩包文件提供了关于如何在Java中调用C/C++编写的动态链接库(DLL)的示例,以及反向操作,即在C/C++中调用DLL。让我们详细探讨这些关键知识点。 首先,`JNA.jar`(Java Native Access)是Java平台上的一个...

    JNI_VC6_Opencv做的dll_图片转视频

    JNI_VC6_Opencv做的图片转视频dll,其中的def有输出函数名,可以修改;在VC6下可直接编译通过;直接在eclipse中配置好后可以直接调用生成的dll。 遇到这方面需求,可以寻求帮助:415926459

    JAVA调用C/C++ DLL文件方法

    其中,JNI(Java Native Interface)是 Java 语言本身提供的调用本地已编译的函数库的方法,本身具有跨平台性,可以在不同的机器上调用不同的本地库。 JNI 使用 JAVA 通过 JNI 调用本地方法,而本地方法是以库文件...

    Java_JNI_VCPP_details.rar_jni_jni vc

    在本案例中,我们关注的是使用JNI调用VC++(Microsoft Visual C++)编写的函数。以下是对这一主题的详细阐述: 1. **JNI简介**: JNI是一种Java编程接口,它为Java虚拟机(JVM)提供了与本地代码交互的能力。通过...

    JNI VC DLL

    标题 "JNI VC DLL" 暗示了我们讨论的主题与Java Native Interface (JNI)相关,同时涉及到使用Visual C++(VC)编译的动态链接库(DLL)文件。JNI是Java平台提供的一种标准方式,允许Java代码和其他语言写的代码进行...

    JNI技术手册 c/c++调用java

    - 减少JNI调用次数。 - 避免频繁的数据复制。 - **解决本机平台接口调用问题:** - 使用平台相关的API。 - 处理不同操作系统下的差异。 - **嵌入式开发应用(JNI小例子):** - 定义新的类和方法。 - 处理Java...

    java dll 得到cpu id

    在描述中提到的"vc 编写dll java 调用",就是指使用Visual C++(VC)来编写DLL,然后通过JNI在Java中调用这些DLL函数。 获取CPU ID通常涉及到硬件级别的操作,可能需要使用到特定的系统API或者硬件指令。在Windows...

    Java JNI 接口在Windows和Unix上的实现

    Java JNI (Java Native Interface) 是Java平台中用于与本地代码交互的一种机制,它允许Java程序调用用其他语言(如C、C++)编写的函数,同时也允许这些本地代码调用Java方法。JNI使得开发者可以在Java应用中充分利用...

Global site tag (gtag.js) - Google Analytics