2

当我将直接 ByteBuffer 返回给 JNI 时,它可以被 JVM/GC 回收多长时间?

假设我有这样的功能:

void* func()
{
  [ ... ]
  jobject result = env->CallStaticObjectMethod(testClass, doSomethingMethod);
  void* pointerToMemory = env->GetDirectBufferAddress(result);
  return pointerToMemory;

}

JVM 不可能知道我要使用它多久pointerToMemory,对吧?如果我想暂时保留该地址和相应的内存怎么办?

假设我想绕过这个问题并将一个字节 [] 从 Java 返回到 JNI,如下所示:

ByteBuffer buf;
byte[] b = new byte[1000];
buf = ByteBuffer.wrap(b);
buf.order(ByteOrder.BIG_ENDIAN); 

return buf.array();

然后像上面一样做,我存储一个指向那个字节[]的指针,并想保留它一段时间。JVM 如何/何时/为什么会在 Java 的支持字节 [] 之后出现?

void* function()
{
  jbyteArray byteArr = (jbytearray)env->CallStaticObjectMethod(testClass, doSomethingMethod);
  jbyte *b= env->GetByteArrayElements(byteArr, 0);  
  return b;
}
4

1 回答 1

1

简短的回答是:如果函数实现了本机方法,则一旦返回,指针就会无效。

为避免这种情况,您应该为您打算在返回后保持有效的所有对象获取全局引用。有关详细信息,请参阅有关本地和全局参考的文档。

要更好地了解 JNI 如何管理来自本机代码的引用,请参阅PushLocalFrame/PopLocalFrame 上的文档

于 2013-03-01T12:13:38.513 回答