我有一个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;
}
}
任何帮助将不胜感激。谢谢!
答案 0 :(得分:3)
如果使用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 []上崩溃