JNI中的全局引用被认为是必须由程序员手动释放的引用。它与c上下文无关。所以像这样的代码:
{
jclass clsStr = (*env)->NewGlobalRef(env,cls);
}
return clsStr;
会发出错误消息,指出clsStr
未定义/未声明。我理解这一点。但我不明白的是这些类型的引用的使用。
上述代码中clsStr
的全局内容是什么?此变量在将来或在调用返回后如何有用?我还读到了“基本上,全局引用对于确保它(及其内容)能够存活到下一个JNI调用”非常有用,但我不明白这一点。
答案 0 :(得分:1)
这意味着您可以通过多次调用本地mathod来保留从NewGlobalRef()
获得的引用。在明确调用DeleteGlobalRef()
之前,该引用仍然有效。
这与local references形成对比:
本地引用仅在创建它的本机方法的动态上下文中有效,并且仅在本机方法的一次调用中有效。一旦本机方法返回,将释放在执行本机方法期间创建的所有本地引用。
如果在调用DeleteGlobalRef()
之前将全局引用存储在允许超出范围的变量中,则会泄漏内存。以下是一个例子:
{
jclass clsStr = (*env)->NewGlobalRef(env,cls);
}
答案 1 :(得分:1)
JNI中的全球参考被认为是必须的参考 由程序员手动释放。它与c无关 上下文。
不,不是。这是来自JNI Specification的可怕的错误引用。这就是它的真实含义:
JNI将本机代码使用的对象引用分为两部分 类别:本地和全球参考。本地参考有效 在本机方法调用的持续时间内,并自动释放 在本机方法返回之后。全局引用仍然有效,直到 他们被明确释放。
JNI中没有任何内容可以改变C编程语言的语义。