HarmonyOS 鸿蒙Next下napi层创建的napi_value的销毁时机是如何的呢?似乎无法触发销毁

发布于 1周前 作者 nodeper 最后一次编辑是 5天前 来自 鸿蒙OS

HarmonyOS 鸿蒙Next下napi层创建的napi_value的销毁时机是如何的呢?似乎无法触发销毁

如以下代码所示,Destructor一直无法触发,哪怕ArkTs的对象已经过了作用域了

napi_value jsThis;
napi_property_descriptor properties[] = {
{ “calculateNum”, nullptr, JNI_CalculateServiceWrappedImpl::calculateNum_jni, nullptr, nullptr, nullptr, napi_default, nullptr }
};
napi_create_object_with_properties(env, &jsThis, 2, properties);

CalculateServiceWrapped* obj = CalculateServiceWrapped::GetInstance();

// 通过napi_wrap将ArkTS对象jsThis与C++对象obj绑定 napi_wrap(env, jsThis, reinterpret_cast<void*>(obj), JNI_CalculateServiceWrappedImpl::Destructor, nullptr, // finalize_hint nullptr);

return jsThis;

{
let calculateService1 = testNapi.CalculateServiceWrapped.GetInstance();
calculateService1.calculateNum(5);
}
//在程序运行到这里后,calculateService1依然没有触发finalize 

2 回复
finalize并不是在你执行完函数就会立即执行,需要再下次GC时才会触发。

在HarmonyOS鸿蒙Next系统中,napi_value的销毁时机通常与JavaScript引擎的垃圾回收机制(GC)相关联。napi_value作为NAPI(Native Abstraction Interface)层的数据结构,代表JavaScript环境中的值。这些值的生命周期管理主要由JavaScript引擎负责。

当napi_value所代表的对象在JavaScript环境中不再被引用时,JavaScript引擎的垃圾回收器会在适当的时机自动销毁这些对象,并回收相应的内存资源。因此,开发者通常不需要手动销毁napi_value,除非有特定的资源管理需求,比如管理原生资源(如文件句柄、网络连接等)。

在NAPI层,如果开发者创建了与napi_value关联的原生资源,应该使用适当的机制(如引用计数、智能指针等)来管理这些资源的生命周期,并在适当的时候释放它们。

如果napi_value的销毁时机看起来不正确,可能是因为JavaScript引擎的垃圾回收器尚未运行,或者napi_value所代表的对象仍在被JavaScript代码引用。这通常不是手动干预销毁时机的问题,而是需要检查和调整JavaScript代码中的引用关系。

如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html

回到顶部