使用JNI将数组从c++发送到Java时发生内存泄漏
Memory leak sending array from C++ to Java with JNI
我在使用JNI发送不断从c++更新到Java的整型数据块时遇到了问题。数据被正确地发送到java,但在java或JNI中有内存泄漏,但我实际上只是将数据复制到一个新的int数组,所以我不知道错误在哪里。
int * intArray = new int [frame_size];
int * getData(){
return intArray;
}
这是JNI代码
JNIEXPORT jintArray JNICALL Java_JNIData_InData_getData
(JNIEnv * env, jobject obj)
{
Data* dataOut;
jclass cls = env->GetObjectClass(obj);
jfieldID fid = env->GetFieldID(cls, "ptr", "J");
dataOut = (Data *) env->GetLongField(obj, fid);
jintArray buffer = env->NewIntArray(frame_size);
env->SetIntArrayRegion(buffer, 0, frame_size, (const jint *)dataOut->getData());
env->DeleteLocalRef(cls);
return buffer;
}
在java中,我只有以下代码:
void processData(){
int [] val = getData();
}
如果我注释getData()
,没有内存泄漏。我认为我必须在c++中做数组的指针,有什么建议吗?
在c++中,你创建了一个新的int[],但永远不会删除它。
试试这个:
int *pIntArray = getData();
env->SetIntArrayRegion(buffer, 0, frame_size, (const jint *) pIntArray );
delete[] pIntArray;
相关文章:
- 内存分配究竟是如何发生的,Java和C如何交互以跟踪同一对象?
- 如何在 ubuntu 上的 php 脚本中获取程序(c,c++,java,python,php)的执行时间和内存使用量?
- 如何从 JNI、Java 和 C++ 释放使用 jShortArray/jByteArray 分配的内存
- C++从 Java 角度设置和映射内存管理
- "new"会导致 Java 中的内存泄漏吗?
- 为什么 C++/Java 内存模型不包含条件变量
- 在 C/C++ 中获取 Java 对象的内存地址
- Java 调用的 C++ 内存泄漏
- 无法在 Mac OS X 上分配内存错误 - java(xx,xx) malloc: *** mmap(size=XX)
- 如果您以Java JNI分配的本机代码中的内存泄漏,会发生什么
- 对象如何存储在内存-Java(C )中
- Java 对象的内存预留
- 将C++内存排序映射到Java
- Java与C++内存分配
- Java和C++之间的共享内存
- OpenCV Java JNIEXPORT 内存管理
- 如何使用本机代码以编程方式查找Java本地变量的内存地址
- 当返回对成员变量的引用时,SWIG-Java内存管理
- Java内存模型和c++ 11内存模型有什么相似之处?
- 将巨大的字符串从本机传递到 java - 内存不足错误