1

据说 JNI 中的全局引用是必须由程序员手动释放的引用。它与 c 上下文无关。所以像这样的代码:

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

return clsStr;

会给出一个错误,说clsStrundefined / undeclared。我明白这一点。但我不明白的是这些类型的引用的使用

clsStr上面代码中的全局是什么?这个变量在将来或调用返回后如何有用?我还读到“基本上,全局引用对于确保它(及其内容)将在下一次 JNI 调用中继续存在”但我不明白这一点。

4

2 回答 2

1

这意味着您可以保留从NewGlobalRef()多次调用本机方法中获得的参考。在您明确调用DeleteGlobalRef().

这与本地参考相反:

本地引用仅在创建它的本机方法的动态上下文中有效,并且仅在本机方法的一次调用中有效。在本地方法执行期间创建的所有本地引用将在本地方法返回后被释放。

如果在调用之前将全局引用存储在允许超出范围的变量中DeleteGlobalRef(),则会泄漏内存。下面是一个例子:

{
    jclass clsStr = (*env)->NewGlobalRef(env,cls); 
}
于 2012-05-15T09:48:24.987 回答
1

据说 JNI 中的全局引用是必须由程序员手动释放的引用。它与 c 上下文无关。

不,不是。这是对JNI Specification的严重错误引用。这就是它真正所说的:

JNI 将本机代码使用的对象引用分为两类:本地引用和全局引用。本地引用在本地方法调用期间有效,并在本地方法返回后自动释放。全局引用在被显式释放之前一直有效。

JNI 中的任何内容都不能改变 C 编程语言的语义。

于 2012-05-15T23:46:23.103 回答