直接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();
そして、上記と同じように、そのbyte []へのポインタを格納し、しばらくそれを保持したいと思います。どのように/いつ/なぜJVMはJavaからのバッキングbyte[]の後に来るのでしょうか?
void* function()
{
jbyteArray byteArr = (jbytearray)env->CallStaticObjectMethod(testClass, doSomethingMethod);
jbyte *b= env->GetByteArrayElements(byteArr, 0);
return b;
}