Android JNI - 如何正确释放在C本机函数中分配的内存

时间:2014-05-05 08:03:13

标签: android c memory-leaks java-native-interface native

我在Android应用中使用了很多内存分配。

为了避免任何内存泄漏,我想更好地了解JAVA垃圾收集器如何释放不再使用的内存。

当在JAVA中分配变量时,很明显GC可以清除它。但是当在C函数中进行分配时,我已在其他帖子中读到JAVA有时可能无法确定变量是否仍在使用中,并且它永远不会被清除,从而导致内存泄漏。

请随时用评论任何可以丰富我们对内存分配和C本机函数释放的理解的信息。我还添加了两个代码示例,我希望您对此有所了解。

谢谢大家!

示例:

代码1 - 当然new_string不是内存泄漏,java能够垃圾收集str_to_return吗?

jstring
Java_com_example_adhocktest_SenderUDP_SendUdpJNI( JNIEnv* env,
                                              jobject thiz)
{
    char * new_string = (char*)malloc(sizeof(char)*200);
        jstring str_to_return = (*env1)->NewStringUTF(env1, new_string);

        free(new_string);
    return (*env1)->NewStringUTF(env1, str_to_return);
}

**代码2 ** - 可以像我们这样直接返回new_string吗?我们怀疑会有一个内存泄漏

jstring
Java_com_example_adhocktest_SenderUDP_SendUdpJNI( JNIEnv* env,
                                              jobject thiz)
{
    char * new_string = (char*)malloc(sizeof(char)*200);

    return (*env1)->NewStringUTF(env1, new_string );
}

1 个答案:

答案 0 :(得分:3)

您正在使用NewStringUTF,它将new_string作为jstring返回。例程不知道如何分配new_string,因此它不会尝试释放它。例程的调用者负责释放new_string,如果这是修复内存泄漏所需的。

/* free required here */
char* heap_string = (char*) malloc(sizeof(char) * 200);
strcpy(heap_string, "This is a heap string");
jstring retstr = (*env1)->NewStringUTF(env1, heap_string);
free(heap_string);
return retstr;

如果是常数,

/* free not required */
jstring retstr = (*env1)->NewStringUTF(env1, "Cannot be freed");
return retstr;

如果字符串是在堆栈上创建的

/* free not required */
const char* stack_string = "on the stack";
jstring retstr = (*env1)->NewStringUTF(env1, stack_string);
return retstr;