当我将直接 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;
}