gpt4 book ai didi

java - JVM 主机应用程序中的 JNI 本地引用生命周期

转载 作者:行者123 更新时间:2023-11-29 04:38:21 26 4
gpt4 key购买 nike

JNI 文档声明本地 Java 对象引用在范围内,直到 native 方法返回;而且它们是线程本地的。

当应用程序托管 Java VM 时,可能会在任何 native 方法之外创建 Java 对象引用。一旦 JVM 运行,主机应用程序可能会获得一个 JNIEnv 并根据需要创建 Java 对象。假设这种情况会产生本地引用。

请问它们的生命周期是多少?它们的生命周期是否与 JVM 的生命周期一样长(除非明确释放)?他们也是本地线程吗?如果在工作线程上,一旦线程与 JVM 分离,它们是否会超出范围?

特别是关于线程局部性:到目前为止,在线程之间重用类对象(从 FindClass() 返回)对我来说可以正常工作。但这是否违反了 JNI 规则?

最佳答案

可以通过以下方式获得可用于创建本地引用的有效 JNIEnv:

  1. 本地方法调用。在方法返回之前,本地引用将一直有效。
  2. JVMTI 回调。同样,本地引用将一直存在,直到回调返回。
  3. GetEnv打电话。

    3.1。来自 JNI_OnLoadAgent_OnLoadAgent_OnAttach 条目。在这些条目中创建的本地引用在条目返回之前有效。

    3.2。来自 AttachCurrentThread 附加的线程功能。引用将一直存在到 DetachCurrentThread被称为。

所有本地引用都是 only valid in the thread它们是在其中创建的。 native 代码不得将本地引用从一个线程传递到另一个线程。

注意 JVM 保证 1 , 2 在一帧中可以创建 16 个本地引用。如果您需要更多本地引用,则必须使用 PushLocalFrame 显式管理它们/PopLocalFrame JNI 函数。

jclassjthreadjstringjarray等都是JNI referencesjobject。它们也需要管理,不像 jmethodIDjfieldID 不是 JNI 引用。

关于java - JVM 主机应用程序中的 JNI 本地引用生命周期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40309592/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com