"clsStr = (*env)->NewGlobalRef(env,cls)"的 clsStr 变量的全局是什么?



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编程语言的语义。

相关内容

  • 没有找到相关文章

最新更新