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