gpt4 book ai didi

Java JNI 引用类型,传递 ByteBuffer

转载 作者:行者123 更新时间:2023-11-30 17:15:58 27 4
gpt4 key购买 nike

我在 native 中创建并分配 DirectByteBuffer。然后我将其传递回 Java。由于 DirectByteBuffer 是在 C 中分配的,因此它驻留在堆内存中,并且对 Java 的垃圾收集器“免疫”,对吧?释放它的唯一方法是从 C 中使用 free()?

但是对 JNI 中的缓冲区对象调用 (*env)->GetObjectRefType() 返回 1,这意味着它是本地引用。据说当 JNI 方法返回时,Java 的 GC 会自动释放本地引用。有人可以澄清在这种情况下 GC 释放了什么吗?我应该使用 (*env)->NewGlobalRef(env, bb) 将分配的缓冲区转换为全局引用吗?

C:

JNIEXPORT jobject JNICALL Java_main_Main_byteBufferTest2(JNIEnv *env, jobject obj){
double *dp = malloc(sizeof(double)*100);
jobject bb = (*env)->NewDirectByteBuffer(env, (void*)dp, sizeof(double)*100);
return bb;
}

Java:

ByteBuffer dbb = byteBufferTest2();

最佳答案

对我的回答持保留态度,因为它已经是很久以前的事了。

I create and allocate DirectByteBuffer in native. I then pass this back to Java. Since DirectByteBuffer is allocated in C

这并不完全正确。您使用 (*env)->NewDirectByteBuffer 分配了 bb,因此它是 JNI。

您使用 malloc 分配了 dp,这是另一回事。 bb 是一个封装 dp 的 Java 对象。

But a call to (*env)->GetObjectRefType() on the buffer object in JNI returns 1, meaning it's a local reference. Local references are said to be automatically freed by Java's GC when JNI method returns.

这是有道理的。字节缓冲区 bb 被释放,但它的底层内存 dp 却没有。

should i use the (*env)->NewGlobalRef(env, bb) to turn the allocated buffer into Global ref?

我想是的。

关于Java JNI 引用类型,传递 ByteBuffer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29809328/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com