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