gpt4 book ai didi

android - "stale global reference"是什么意思以及如何存储作业对象并在线程之间传递它们?

转载 作者:行者123 更新时间:2023-11-29 21:50:13 34 4
gpt4 key购买 nike

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

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

这就是我正在尝试做的事情:有一个包含 jobject 容器的对象。每当 Java 调用我的 native 方法并传递一个我需要存储以备后用的引用时,我都会为该 jobject 创建新的全局引用,将全局引用添加到容器并存储其索引。每当我需要使用 jobject 时,我都会通过索引获取它。这种方法有什么问题?

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

最佳答案

Failing to solve the problem by explicitly managing local references (got local ref table overflow in the end of my experiments)

我在您的代码中闻到了更深层次的问题。如果您在从当前 JNI 调用返回之前知道您正在创建并正确地、手动地删除它们的所有本地引用,那么本地引用表溢出就不会发生。本地引用创建 might be very subtle ,它不仅仅是 FindClass

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

关于android - "stale global reference"是什么意思以及如何存储作业对象并在线程之间传递它们?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14627902/

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