如何使用napi_add_finalizer接口在ArkTS对象被垃圾回收前执行清理操作?

阅读 582
1 个回答

在C++代码中,先创建一个ArkTS对象,然后创建对该对象的引用(如使用napi_create_reference),接着调用napi_add_finalizer接口,传入对象、数据(可为空)、清理回调函数(如Finalizer)等参数,注册在对象被垃圾回收时执行的清理操作。在清理回调函数中实现资源清理逻辑(如示例中打印日志表示释放资源)。示例代码如下:

// log.h用于C++中日志打印
#include "hilog/log.h"
#include "napi/native_api.h"

napi_ref g_ref;

void Finalizer(napi_env env, void *data, void *hint) {
    OH_LOG_INFO(LOG_APP, "Node-API: Use terminators to release resources.");
}

static napi_value CreateReference(napi_env env, napi_callback_info info) {
    napi_value obj = nullptr;
    napi_create_object(env, &obj);
    napi_value value = nullptr;
    napi_create_string_utf8(env, "CreateReference", NAPI_AUTO_LENGTH, &value);
    napi_set_named_property(env, obj, "key", value);
    napi_status status = napi_create_reference(env, obj, 1, &g_ref);
    if (status!= napi_ok) {
        napi_throw_error(env, nullptr, "napi_create_reference fail");
        return nullptr;
    }
    void *data = {};
    napi_add_finalizer(env, obj, data, Finalizer, nullptr, &g_ref);
    //... 其他操作
    return obj;
}

本文参与了 【 HarmonyOS NEXT 技术问答冲榜,等你来战!】欢迎正在阅读的你也加入。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进