Java GC是否会在Android上自动处置/解除分配jni中分配的内存?
我在JNI中分配内存和新的ByteBuffer对象,如下所示: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
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在本机方法返回后释放所有本地引用。”这对我很有帮助!谢谢