当前位置: 首页 > 知识库问答 >
问题:

JNI参数是本地或全局引用

缪成天
2023-03-14

我读过几篇关于JNI本地和全球的参考文献。但是我找不到一个明确的答案,作为参数传递给JNI函数的Java对象是局部引用还是全局引用。我认为它应该是全球性的,但是有一个问题:

首先,我获取Java对象指针并保存它。然后,本机回调函数调用该对象的方法。回调函数是从单独的线程调用的。线程是使用AttachCurrentThread()创建的,因此JVM知道它。JNIEnv*变量也是有效的,对象没有被垃圾调用,但是我收到警告,然后崩溃。

JNI警告:0x4108edb8不是Lcom/my/company/MyClass中的有效JNI引用;. load:(Ljava/lang/String;)V(GetObjectClass)

共有2个答案

厉熠彤
2023-03-14

从理论上讲,如果函数不是从Java代码调用的,你可以得到一个全局引用(我有时直接从其他JNI方法调用我的JNI方法,而不要求JVM这样做),但你应该总是假设它们是本地的,并像这样对待它们。如果要存储它们以供以后使用,则应创建一个新的 gobal 引用。事实上,即使你可以得到一个全局引用,你应该如何对待它们也没有区别。在任何情况下,您都不必删除它们,即使您碰巧获得了全局引用(我认为上面描述的方式是唯一的方法),在不首先对其进行新引用的情况下存储它也是错误的。如果谁把它交给你删除了引用,它将变得无效。

编辑:以上是编辑后的版本,我希望能让@EJP更满意。同样的信息,只是更清晰。他确实有一点,在几乎所有情况下,JNI规范都是最重要的,即使在这种情况下没有区别:-)

柳宪
2023-03-14

> < li>

这是本地参考。"对象作为本地引用传递给本机方法"

JNIEnv*指针跨JNI方法调用边界无效,更不用说线程边界了。

在您的情况下,必须将本地引用转换为全局引用,以便回调方法使用。

 类似资料:
  • 问题内容: 我正在使用jProfiler查找Java swing应用程序中的内存泄漏。我确定了数量不断增长的JFrame实例。 此框架被打开,然后关闭。 使用jProfiler并查看GC根目录的路径,只有一个引用“ JNI全局引用”。 这是什么意思?为什么将它挂在框架的每个实例上? 问题答案: Wikipedia很好地概述了Java本机接口,从本质上讲,它允许Java与以其他语言编写的本机操作系统

  • 问题内容: 我有一个Java类,具有使用C ++实现的本机函数,称为。的本机实现很简单,只是包裹,并调用它的构造函数和,,…功能。一个字段中用于存储的全局引用一个对象。该对象具有终结器,该终结器应该在垃圾回收对象时破坏全局引用,因此我不会泄漏全局引用。 当我运行一个简单的测试循环以创建多个对象而不显式释放所创建的对象时,在日志(LOG1)之后报告了JNI错误。但是,如果我在离开测试功能之前显式释放

  • 我有一个Java类,其中包含用C语言实现的本机函数,称为。的本机实现很简单,只需包装并调用其构造函数和、、…函数。

  • 在我之前的问题中,我在JNI调用之间缓存了JNIEnv*。从评论中我知道它是无效的,这导致我学习了JNI本地和全局引用。我做了一些测试程序来理解它。从测试程序中,我无法理解全局引用的使用。因为本地引用本身在多个JNI调用之间工作正常。我有3个测试程序的问题 急于知道原因,本地引用是如何被缓存并正常工作的 ArrayList大小的更改有效,但String对象无效 有理由知道缓存的JNIEnv是如何工

  • JNI参考文献中说 “本地引用在本机方法调用期间有效。它们在本机方法返回后自动释放。 资料来源:http://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/functions.html#global_local 我有点迷路了。根据上述内容,我必须显式调用NewGlobalRef并传递从调用NewObject返回的对象。我试过这个,似

  • 全局配置参数动态改变初始化配置,注意并不是所有的初始化配置都可以改变的 目前只可以改变以下参数 字段名称 备注 EnableDingTalk bool类型 动态控制是否开启DingTalk功能 如果false的话 添加job的窗体里面会没有配置DingTalk相关参数 CurrentDomain string类型 动态设置当前站点域名的功能,这个设置了会影响钉钉的发送内容里面增加一个当前通知job