【发布时间】:2013-03-01 12:05:32
【问题描述】:
当我将一个直接的 ByteBuffer 返回给 JNI 时,它需要多长时间才能被 JVM/GC 回收?
假设我有这样的功能:
void* func()
{
[ ... ]
jobject result = env->CallStaticObjectMethod(testClass, doSomethingMethod);
void* pointerToMemory = env->GetDirectBufferAddress(result);
return pointerToMemory;
}
JVM 不可能知道我要使用那个pointerToMemory 多久,对吧?如果我想暂时保留该地址和相应的内存怎么办?
假设我想绕过这个问题,像这样从 Java 向 JNI 返回一个 byte[]:
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;
}
【问题讨论】: