使用JNI将数组从c++发送到Java时发生内存泄漏

Memory leak sending array from C++ to Java with JNI

本文关键字:Java 内存 泄漏 数组 c++ 使用 JNI      更新时间:2023-10-16

我在使用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;