代码之家  ›  专栏  ›  技术社区  ›  Flavio

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

  •  5
  • Flavio  · 技术社区  · 14 年前

    我使用的是JNI调用API,它在C程序中启动一个JVM;在这种情况下,您会得到一个JNIENV指针,该指针在显式销毁JVM之前一直有效。 本地/全球差异在这里是否仍然适用?由于jnienv一直在作用域中,所以对新创建的对象的本地引用的含义是什么?

    3 回复  |  直到 13 年前
        1
  •  6
  •   cmccabe    13 年前

    JNI的书对这种情况有一点简短,但是如果你研究的足够久,你可以弄清楚。基本上,当您将本机C线程附加到JVM时,您将创建一个本地上下文,它可以存储一些本地引用。

    这些本地参考将 从未 释放,直到使用deleteLocalRef手动释放它们,或者通过调用DetachThread销毁本地上下文。由于您可能不需要对JVM进行大量的附加和分离,因此在上调用DeleteLocalRef非常重要。 每一个 您创建的本地引用。

    自然的下一个问题是,“如果本地引用在JVM分离之前不被GC处理,为什么还要创建全局引用?”本地引用不能在线程之间共享。所以您仍然需要创建全局引用来实现这一点。

        2
  •  1
  •   Xeor    14 年前

    我认为创建JVM的线程变成Java线程,它和Java中创建的任何线程一样,或者通过AutoCurrutthTHEAD()连接,它有本地堆栈框架。因此,您创建的任何对象都将成为此堆栈帧中的本地引用,当您销毁JVM(不能分离主线程)或调用DeleteLocalRef()时,该堆栈帧将过期。

        3
  •  1
  •   JCL    14 年前

    可能调用detachcurrenthread()也会释放引用。 不幸的是,JNI规范没有明确定义调用API的引用行为,实际的语义可能取决于特定的JVM实现:s