我在JNI中分配内存和新的ByteBuffer对象如下:
uint8_t* pBuffer = (uint8_t*)malloc(size);
// fill the pBuffer
jobject byteBufferInJni = (*env)->NewDirectByteBuffer(env, pBuffer, size);
然后将byteBufferFromJni传递给Java层,如下所示:
callback(byteBufferInJni);
在java图层中,获取对象byteBufferInJni
。
问题是:
如果我在java中取消引用byteBufferInJni
,就像这样:
byteBufferInJni = null;
GC会{/ 1}}处理/解除分配吗?
答案 0 :(得分:1)
不,JVM不知道使用了malloc
,并且应该使用free
取消分配内存。如果ByteBuffer要自动调用free
,如果内存是静态分配的,JVM会崩溃:
#include <stdlib.h>
int main()
{
char *str = "Hello, World!";
free(str); // Never do this!
}
你有责任释放它。有许多方法可以获取内存,并且需要非常具体的方法来释放它,例如, malloc/free
,new/delete
,new[]/delete[]
。