关于clsStr变量的全局是什么,“clsStr =(* env) – > NewGlobalRef(env,cls)”?
JNI中的全局引用被认为是必须由程序员手动释放的引用。 它与c上下文无关。 所以像这样的代码:
{ jclass clsStr = (*env)->NewGlobalRef(env,cls); } return clsStr;
会给出一个错误,说clsStr
是未定义/未声明的 。 我理解这一点。 但我不明白的是使用这些类型的参考。
在上面的代码中clsStr
全局是什么? 此变量在将来或在调用返回后如何有用? 我还读到“基本上,全局引用对于确保它(及其内容)将存活到下一个JNI调用是有用的”但我不明白这一点。
这意味着您可以通过多次调用本机NewGlobalRef()
来保留从NewGlobalRef()
获得的引用。 在显式调用DeleteGlobalRef()
之前,引用将保持有效。
这与本地参考文献形成对比:
本地引用仅在创建它的本机方法的动态上下文中有效,并且仅在本机方法的一次调用内有效。 一旦本机方法返回,将在执行本机方法期间创建的所有本地引用都将被释放。
如果在调用DeleteGlobalRef()
之前将全局引用存储在允许超出范围的变量中,则会泄漏内存。 以下是一个例子:
{ jclass clsStr = (*env)->NewGlobalRef(env,cls); }
JNI中的全局引用被认为是必须由程序员手动释放的引用。 它与c上下文无关。
不,不是。 这是JNI规范中可怕的错误引用。 这是它真正说的:
JNI将本机代码使用的对象引用分为两类:本地引用和全局引用。 本地引用在本机方法调用的持续时间内有效,并在本机方法返回后自动释放。 全局引用在显式释放之前仍然有效。
JNI中的任何内容都不能改变C编程语言的语义。