java - clsStr 变量是 "clsStr = (*env)->NewGlobalRef(env,cls)"的全局变量是什么?

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

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

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

return clsStr;

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

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

最佳答案

这意味着您可以在对 native 方法的多次调用中保留从 NewGlobalRef() 获得的引用。在您显式调用 DeleteGlobalRef() 之前,引用将保持有效。

这与 local references 形成对比:

A local reference is valid only within the dynamic context of the native method that creates it, and only within that one invocation of the native method. All local references created during the execution of a native method will be freed once the native method returns.

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

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

关于java - clsStr 变量是 "clsStr = (*env)->NewGlobalRef(env,cls)"的全局变量是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10597968/

相关文章:

java - 在java中,有没有一种方法可以检查对象如何从垃圾收集根仍然可达?

具有子类唯一性和多态性的Java引用类型

java - Qt Jambi 和线程

java - 将 char 数组从 java 返回到 C - JNI

Java 执行器服务 : should I put a lock before to use execute?

java - Java 的 for-each 是否为每次迭代调用一个嵌入式方法(返回集合)?

c++ - 当类型转换为 int 时,C/C++ bool 类型是否总是保证为 0 或 1?

c - dought从c中的函数返回数组和int数据类型

c# - 检测 WOL 可能性

c - 包含 jni.h : No such file or directory, 路径