JNI 内存从字节数组泄漏

JNI memory leak from byte array

本文关键字:数组 泄漏 字节数 字节 内存 JNI      更新时间:2023-10-16

我有一个Java程序,可以多次调用本机函数。我的问题是这个函数有内存泄漏,我为摆脱它所做的一切都会导致内存转储。任何帮助将不胜感激。

这是我的代码

JNIEXPORT void JNICALL Java_class_method_getInput
(JNIEnv *env, jobject obj)
{
    if (inputIsAvailable)
    {
    int size = getBufferCurrentIndex();
    size -= getBufferReadIndex();
    size *= 2;
    char *finalSendArray = new char[size];
    getCommand(finalSendArray);
    jbyteArray byteArray = env->NewByteArray(size / 2);
    env->SetByteArrayRegion(byteArray, 0, size / 2, (jbyte*) finalSendArray);
    while(methodID == 0)
    {
        jclass cls = env->GetObjectClass(obj);
        methodID = env->GetMethodID(cls, "setCommand", "([B)V" );
    }
    env->CallVoidMethod(obj, methodID, byteArray);
    //env->ReleaseByteArrayElements(byteArray, (jbyte*) finalSendArray, JNI_ABORT);
我的

问题是上面的 ^ 代码如果未注释会导致内存转储,如果未取消注释,我的程序在几分钟内耗尽内存

    env->DeleteLocalRef(byteArray);
    delete[] finalSendArray;
    }
}

任何帮助将不胜感激。谢谢!

如果使用JNI_ABORT参数,ReleaseByteArrayElements也会释放内存。因此,当您稍后执行删除和释放时,其中一个指针指向导致转储的未初始化内存。

其中一个会起作用,我相当确定它是第一个有效的。

env->ReleaseByteArrayElements(byteArray, (jbyte*) finalSendArray, JNI_ABORT);
delete[] finalSendArray;

如果第一个失败,请尝试此操作。

env->ReleaseByteArrayElements(byteArray, (jbyte*) finalSendArray, JNI_ABORT);
env->DeleteLocalRef(byteArray);

在 ReleaseByteArrayElements 之后放一个 print 语句,你会看到你的程序正在执行超出该命令并在 Release/Delete[] 上崩溃。

搜索"表 4-10 基元阵列释放模式"