我在 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;
pBuffer
会被 GC 处理/释放吗?
不,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[]
。
我是一名优秀的程序员,十分优秀!