当不再引用 C++ 对象的 Kotlin 包装器对象时(minSdkVersion 24),如何清理 C++ 对象?

问题描述 投票:0回答:1

我是 Kotlin 的初学者,目前正在致力于将 C++ 库集成到用 Kotlin 编写的 Android 应用程序中。为了实现这一目标,我正在为 C++ 库实现 JNI 和 Kotlin 包装器。

在我的设计中,Kotlin 对象保存对 C++ 对象的引用。我想确保当删除对相应 Kotlin 对象的所有引用时,正确释放 C++ 对象使用的内存。

我了解了java.lang.ref.Cleaner,它可以注册清理任务以在不再引用对象时运行。但是,我的应用程序的 minSdkVersion 设置为 24,并且 Cleaner 仅适用于 API 级别 33。

您能建议一种替代方法来实现这种清理吗?本质上,我正在寻找一种机制,当对象不再被引用时自动触发清理任务,类似于 C++ 中的

std::shared_ptr
在其引用计数降至零时调用析构函数。

java android c++ kotlin
1个回答
0
投票

Cleaner
是根据以下概念实现的:

  • 幻像引用,其存在的唯一目的是检测何时无法通过通常的方式访问对象,并且
  • 引用队列,允许您等待幻像引用过期。

PhantomReference 构造函数为与给定 ReferenceQueue 关联的给定对象返回一个新的幻像引用。然后,您可以将 PhantomReference 与单独的清理操作相关联。最后,在

ReferenceQueue#remove()
上设置一个线程块并运行与该 PhantomReference 关联的清理操作。

您无法读取该对象,因为在调用

remove()
时它已经从内存中消失,因此您有责任确保清理操作是幂等的,或者在对象被删除时解除清理操作。

© www.soinside.com 2019 - 2024. All rights reserved.