JNI中的Global Reference据说是一种必须由程序员手动释放的引用。它与 c 上下文无关。所以像这样的代码:
{
jclass clsStr = (*env)->NewGlobalRef(env,cls);
}
return clsStr;
会给出一个错误,指出 clsStr
是 undefined/undeclared。我明白这一点。但我不明白的是这些类型的引用的使用。
上面代码中clsStr
的全局变量是什么?这个变量在将来或调用返回后有何用处?我还读到“基本上,全局引用可用于确保它(及其内容)在下一次 JNI 调用中继续存在”,但我不明白这一点。
最佳答案
这意味着您可以在对 native 方法的多次调用中保留从 NewGlobalRef()
获得的引用。在您显式调用 DeleteGlobalRef()
之前,引用将保持有效。
这与 local references 形成对比:
A local reference is valid only within the dynamic context of the native method that creates it, and only within that one invocation of the native method. All local references created during the execution of a native method will be freed once the native method returns.
如果在调用 DeleteGlobalRef()
之前将全局引用存储在允许超出范围的变量中,则会泄漏内存。以下是一个例子:
{
jclass clsStr = (*env)->NewGlobalRef(env,cls);
}
关于java - clsStr 变量是 "clsStr = (*env)->NewGlobalRef(env,cls)"的全局变量是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10597968/