JNI中的全局引用被称为必须由程序员手动释放的引用。它与c上下文无关。所以代码如下:

{
    jclass clsStr = (*env)->NewGlobalRef(env,cls);
}

return clsStr;

将给出一个错误,说明clsStr未定义/未声明。我明白。但我不明白的是这些类型的引用的使用。
上面代码中clsStr的全局性是什么?这个变量在将来或调用返回后如何有用?我还读到“基本上,全局引用对于确保它(及其内容)能够在下一次JNI调用中存活是有用的”,但我不理解这一点。

最佳答案

这意味着您可以在多次调用本机mathod时保留从NewGlobalRef()获得的引用。在显式调用DeleteGlobalRef()之前,引用将保持有效。
这与local references相反:
本地引用仅在创建它的本机方法的动态上下文中有效,并且仅在本机方法的一次调用中有效。一旦本机方法返回,在本机方法执行期间创建的所有本地引用都将被释放。
如果在调用DeleteGlobalRef()之前将全局引用存储在允许超出范围的变量中,则会泄漏内存。下面就是一个例子:

{
    jclass clsStr = (*env)->NewGlobalRef(env,cls);
}

07-24 18:37