在 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 包含文件似乎表明这将是一个正确的假设,但我在网上找不到太多来支持这个假设:
#ifdef __cplusplus
class _jobject {};
...
class _jarray : public _jobject {};
typedef _jbyteArray *jbyteArray;
#else
....
#endif
背景:
我有一些 JNI 代码存在内存泄漏,我正试图确定它。总进程大小不断增加,但 JConsole 表示 JVM 的堆内存使用和非堆使用保持相当稳定。所以我的结论是泄漏必须在原始 C++ 本身或 JNI 代码中。