Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/205.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java GC是否会在Android上自动处置/解除分配jni中分配的内存?_Java_Android_C_Garbage Collection - Fatal编程技术网

Java GC是否会在Android上自动处置/解除分配jni中分配的内存?

Java GC是否会在Android上自动处置/解除分配jni中分配的内存?,java,android,c,garbage-collection,Java,Android,C,Garbage Collection,我在JNI中分配内存和新的ByteBuffer对象,如下所示: uint8_t* pBuffer = (uint8_t*)malloc(size); // fill the pBuffer jobject byteBufferInJni = (*env)->NewDirectByteBuffer(env, pBuffer, size); 然后将byteBufferFromJni传递给Java层,如下所示: callback(byteBufferInJni); byteBufferInJ

我在JNI中分配内存和新的ByteBuffer对象,如下所示:

uint8_t* pBuffer = (uint8_t*)malloc(size);
// fill the pBuffer
jobject byteBufferInJni = (*env)->NewDirectByteBuffer(env, pBuffer, size);
然后将byteBufferFromJni传递给Java层,如下所示:

callback(byteBufferInJni);
byteBufferInJni = null;
在java层中,获取对象
byteBufferInJni

问题是:

如果我在java中取消引用
byteBufferInJni
,如下所示:

callback(byteBufferInJni);
byteBufferInJni = null;

pBuffer是否将由GC处置/解除分配?

否,JVM不知道使用了
malloc
,应该用
空闲的
解除分配内存。如果ByteBuffer自动调用
free
,则如果静态分配内存,JVM将崩溃:

#include <stdlib.h>

int main()
{
    char *str = "Hello, World!";
    free(str); // Never do this!
}
#包括
int main()
{
char*str=“你好,世界!”;
自由(str);//永远不要这样做!
}

释放它是你的责任。获取内存的方法有很多,需要非常具体的方法来释放内存,例如
malloc/free
new/delete
new[]/delete[]
,谢谢。我想确保谁对解放负责。NewDirectByteBuffer()的对象如何?“JNI函数返回的所有Java对象都是本地引用。”。。。“在大多数情况下,程序员应该依靠VM在本机方法返回后释放所有本地引用。”这对我很有帮助!谢谢