1

我最近开始使用我的 Android JNI 应用程序以 API 级别 14 为目标,并立即发现了此处描述的问题。

未能通过显式管理本地引用来解决问题(在我的实验结束时出现本地引用表溢出),我决定简单地切换到全局引用。现在,我遇到了该文章中未描述的“尝试使用过时的全局引用”问题。

这就是我想要做的:有一个对象有一个jobjects 的容器。每当 Java 调用我的本机方法并传递我需要存储以供以后使用的引用时,我都会为其创建新的全局引用jobject,将全局引用添加到容器并存储其索引。每当我需要使用时,jobject我都会通过索引来获取它。这种方法有什么问题?

PS 每当我调用 JNI 方法时,我都会JNIEnv对调用线程使用正确的方法。进行 JNI 调用的线程附加到 JVM。

4

2 回答 2

1

无法通过显式管理本地引用来解决问题(在我的实验结束时出现本地引用表溢出)

我在您的代码中闻到了更深层次的问题。如果您知道在从当前 JNI 调用返回之前手动正确地创建和删除它们的所有本地引用,则本地引用表溢出根本不会发生。本地 ref 创建可能非常微妙,不仅仅是FindClass.

无论如何,如果你想让它与全局引用一起工作(考虑到你描述的使用场景,这似乎是正确的做法)我怀疑这一点:你的“容器”有时也需要删除那些存储的引用,而不仅仅是我猜加了。你确定你正在移除正确的,并调用DeleteGlobalRef正确的,而不是其他留在容器中的?换句话说,对于代码中的每个NewGlobalRef代码,请确保您知道相关的位置DeleteGlobalRef,并且您对何时以及为何调用它充满信心。

于 2013-02-01T09:22:40.903 回答
1

让您的 Java 方法将对包含的作业对象的引用传递给每个本机方法。这样它总是自动正确的,根本不需要变成 a GlobalRef,所以你不会得到局部变量表溢出,根本不用担心DeleteGlobalRef()等等。

于 2013-02-03T03:50:59.443 回答