2014-05-05 65 views
1

我在我的Android應用程序中使用C中的內存分配很多。Android的JNI - 如何正確釋放內存分配在C本機功能

爲了避免任何內存泄漏,我想更好地理解JAVA垃圾回收器如何釋放不再使用的內存。

當在JAVA中分配變量時,顯然GC可以清除它。但是當在C函數中進行分配時,我已經在其他文章中讀到了JAVA有時可能不確定變量是否仍在使用,並且它永遠不會被清除,從而導致mem泄漏。

請隨時與發表評論任何有助於我們理解內存分配和釋放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?我們懷疑會有mem泄漏

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

回答

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; 
+0

謝謝您的回答上創建。 所以,如果我理解正確,你給的最後一個例子的jstring將被JAVA釋放,因爲它是該函數的調用者? – Wakaka

+0

是的--J類型將被Java釋放。 – cup