什么是关于clsStr变量的全局,它是“clsStr =(* env) - > NewGlobalRef(env,cls)”?

时间:2012-05-15 09:36:09

标签: java c java-native-interface global-variables

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

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

return clsStr;

会发出错误消息,指出clsStr 未定义/未声明。我理解这一点。但我不明白的是这些类型的引用的使用

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

2 个答案:

答案 0 :(得分:1)

这意味着您可以通过多次调用本地mathod来保留从NewGlobalRef()获得的引用。在明确调用DeleteGlobalRef()之前,该引用仍然有效。

这与local references形成对比:

  

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

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

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

答案 1 :(得分:1)

  

JNI中的全球参考被认为是必须的参考   由程序员手动释放。它与c无关   上下文。

不,不是。这是来自JNI Specification的可怕的错误引用。这就是它的真实含义:

  

JNI将本机代码使用的对象引用分为两部分   类别:本地和全球参考。本地参考有效   在本机方法调用的持续时间内,并自动释放   在本机方法返回之后。全局引用仍然有效,直到   他们被明确释放。

JNI中没有任何内容可以改变C编程语言的语义。