【问题标题】:Android JNI - How to properly release memory allocated in C native functionsAndroid JNI - 如何正确释放 C 本机函数中分配的内存
【发布时间】:2014-06-21 11:18:30
【问题描述】:

我在我的 Android 应用程序中使用 C 语言分配了大量内存。

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

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

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

谢谢大家!

例子:

代码 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 );
}

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 感谢您的回答。因此,如果我理解正确,您给出的最后一个示例的 jstring 将被 JAVA 释放,因为它是函数的调用者?
    • 是的 - Java 将释放 j 类型。
    • const char* stack_string 只把指针放到栈上;你想要const char stack_string[]
    猜你喜欢
    • 1970-01-01
    • 2012-11-06
    • 2011-05-16
    • 1970-01-01
    • 2021-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多