请问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[].