Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从C++;使用JNI访问Java 我在用JNI发送C++数据块到java的数据块中存在大量问题。数据被正确地发送到java,但在java或JNI中存在内存泄漏,但实际上我只是将数据处理到一个新的int数组中,所以我不知道错误在哪里 int * intArray = new int [frame_size]; int * getData(){ return intArray; }_Java_C++_Memory Leaks_Java Native Interface - Fatal编程技术网

从C++;使用JNI访问Java 我在用JNI发送C++数据块到java的数据块中存在大量问题。数据被正确地发送到java,但在java或JNI中存在内存泄漏,但实际上我只是将数据处理到一个新的int数组中,所以我不知道错误在哪里 int * intArray = new int [frame_size]; int * getData(){ return intArray; }

从C++;使用JNI访问Java 我在用JNI发送C++数据块到java的数据块中存在大量问题。数据被正确地发送到java,但在java或JNI中存在内存泄漏,但实际上我只是将数据处理到一个新的int数组中,所以我不知道错误在哪里 int * intArray = new int [frame_size]; int * getData(){ return intArray; },java,c++,memory-leaks,java-native-interface,Java,C++,Memory Leaks,Java Native Interface,下面是JNI代码 JNIEXPORT金塔莱JNICALL Java_JNIData_InData_getData (JNIEnv*env,jobject对象) { 数据*数据输出; jclass cls=env->GetObjectClass(obj); jfieldID fid=env->GetFieldID(cls,“ptr”,“J”); 数据输出=(数据*)环境->GetLongField(obj,fid); jintArray buffer=env->NEINTARRAY(帧大小); e

下面是JNI代码

JNIEXPORT金塔莱JNICALL Java_JNIData_InData_getData
(JNIEnv*env,jobject对象)
{
数据*数据输出;
jclass cls=env->GetObjectClass(obj);
jfieldID fid=env->GetFieldID(cls,“ptr”,“J”);
数据输出=(数据*)环境->GetLongField(obj,fid);
jintArray buffer=env->NEINTARRAY(帧大小);
env->SetIntArrayRegion(缓冲区,0,帧大小,(const jint*)数据输出->获取数据();
env->DeleteLocalRef(cls);
返回缓冲区;
}
在java中,我只有以下代码:

void processData(){
   int [] val = getData();
}

如果我注释
getData()
,则没有内存泄漏。我想我必须在C++中做数组的指针,在C++中有任何建议?

< p>,你正在创建一个新的int [],但是永远不要删除它。 试试这个:

int *pIntArray = getData();
env->SetIntArrayRegion(buffer, 0, frame_size, (const jint *) pIntArray );
delete[] pIntArray;

当然,它会泄漏内存。如果您要呼叫
new[]
您要呼叫
delete[]
的电话在哪里?C++不是java。问题是,如果某些原因,代码打开> StimTaRayLeale引发异常,那么你就打开了自己的内存泄漏。最好用RAII来做这个,对。最好在整个过程中使用智能指针,包括getData()。对于JNI编码,您几乎不应该使用裸指针,尤其是对于这样的事情。这些JNI函数可能会变得不稳定,并且在创建数组字段时很容易出现内存泄漏。好的,尝试使用智能指针,当我删除[]pIntArray时,我会出现错误,我相信这是因为我在main@PaulMcKenzieJNI函数不抛出C++异常。但是,它们可以将JVM线程置于异常状态,并且应该对此进行检查。因此,无论如何,在C++代码中使用流式控件是方便的。