我是 Kotlin 的初学者,目前正在致力于将 C++ 库集成到用 Kotlin 编写的 Android 应用程序中。为了实现这一目标,我正在为 C++ 库实现 JNI 和 Kotlin 包装器。
在我的设计中,Kotlin 对象保存对 C++ 对象的引用。我想确保当删除对相应 Kotlin 对象的所有引用时,正确释放 C++ 对象使用的内存。
我了解了java.lang.ref.Cleaner,它可以注册清理任务以在不再引用对象时运行。但是,我的应用程序的 minSdkVersion 设置为 24,并且 Cleaner 仅适用于 API 级别 33。
您能建议一种替代方法来实现这种清理吗?本质上,我正在寻找一种机制,当对象不再被引用时自动触发清理任务,类似于 C++ 中的
std::shared_ptr
在其引用计数降至零时调用析构函数。
Cleaner
是根据以下概念实现的:
PhantomReference 构造函数为与给定 ReferenceQueue 关联的给定对象返回一个新的幻像引用。然后,您可以将 PhantomReference 与单独的清理操作相关联。最后,在
ReferenceQueue#remove()
上设置一个线程块并运行与该 PhantomReference 关联的清理操作。
您无法读取该对象,因为在调用
remove()
时它已经从内存中消失,因此您有责任确保清理操作是幂等的,或者在对象被删除时解除清理操作。