通过Invocation API获得的JNI对象引用:本地还是全局?

Fla*_*vio 5 java-native-interface reference invocation

我正在使用JNI调用API,它在C程序中启动JVM; 在这种情况下,您将获得一个JNIEnv指针,该指针在您明确销毁JVM之前一直有效.本地/全球的区别是否仍然适用于此?由于JNIEnv始终保持在范围内,因此对新创建的对象的本地引用的含义是什么?

cmc*_*abe 6

JNI的书对这种情况略显简洁,但如果你研究得足够久,你可以弄明白.基本上,当您将本机C线程附加到JVM时,您将创建一个可以存储一些本地引用的本地上下文.

在使用DeleteLocalRef手动释放它们之前永远不会释放这些本地引用,或者通过调用DetachThread来销毁本地上下文.由于您可能没有对JVM进行大量附加和分离,因此在您创建的每个本地引用上调用DeleteLocalRef非常重要.

自然的下一个问题是"为什么要创建全局引用,如果本地引用在JVM分离之前没有得到GC?" 好吧,线程之间不能共享本地引用.所以你仍然需要创建全局引用来做到这一点.