请问GCdispose/deallocate在jni上自动分配的内存Android?
Will the GC dispose/deallocate the memory allocated in jni automatically on Android?
我在 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
disposed/deallocated 会被 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[]
.
我在 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
disposed/deallocated 会被 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[]
.