JNIでは、jbyteArrayはジョブジェクトとみなされますか? つまり、実行時間の長い C++ コードがある場合、次のようなコードを使用してオブジェクト参照を解放できますか?
JNIEnv* env;
jobject getJavaObj(bool useArray) {
if (useArray) {
jbyteArray dataArray = env->NewByteArray(getDataSize());
env->SetByteArrayRegion(dataArray, 0, getDataSize(), dataPtr);
return static_cast<jobject>(dataArray)
} else {
jobject javaByteBuffer = env->NewDirectByteBuffer(dataPtr, getDataSize());
return javaByteBuffer;
}
}
// ...
jobject theData = getJavaObj(true);
// ... Code to use theData jobject goes here...
env->DeleteLocalRef(theData); // Will this cause any issues?
JDK の jni.h インクルード ファイルは、これが正しい仮定であることを示しているようですが、この仮定を裏付ける Web 上の情報はあまり見つかりません。
#ifdef __cplusplus
class _jobject {};
...
class _jarray : public _jobject {};
typedef _jbyteArray *jbyteArray;
#else
....
#endif
バックグラウンド:
突き止めようとしているメモリ リークのある JNI コードがいくつかあります。プロセスの合計サイズは増え続けていますが、JConsole によると、JVM のヒープ メモリの使用量と非ヒープの使用量はほぼ一定のままです。したがって、リークは生の C++ 自体、または JNI コードにあるに違いないというのが私の結論です。