讨论广场 问答详情
napi_value持有了ArkTS/JS对象,同时,napi_value受napi_handle_scope管理,scope中napi_value持有的JS对象不会被释放。怎么理解这个概念呢?
aurora6688 2026-08-23 01:06:55
86 评论 分享
harmonyos

napi_value是一个C的结构体指针,表示一个ArkTS/JS对象的引用。对于初学者来说,学习鸿蒙开发如何来入门比较好?

86 评论 分享
写回答
全部评论(1)

Node-API支持的数据类型和接口

napi_value

napi_value是一个C的结构体指针,表示一个ArkTS/JS对象的引用。napi_value持有了ArkTS/JS对象,同时,napi_value受napi_handle_scope管理,scope中napi_value持有的JS对象不会被释放;出scope后,napi_value将失效,不再持有对应的ArkTS/JS对象。

napi_env

  • 用于表示Node-API执行时的上下文,Native侧函数入参,并传递给函数中的Node-API接口。

  • napi_env与ArkTS/JS线程的上下文环境绑定,每一个napi_env都持有独立的运行时上下文环境,当ArkTS/JS线程退出之后,相应的napi_env将不再有效。

  • 禁止缓存napi_env,禁止在不同线程间传递napi_env。

napi_threadsafe_function

napi_threadsafe_function用来创建一个线程安全的ArkTS/JS函数,可以在不同的线程中调用。可以用于将异步操作的结果传递给ArkTS/JS环境,例如从另一个线程中读取数据或执行计算密集型操作。线程安全函数回调的执行仅在创建线程安全函数的ArkTS线程中执行。通过使用napi_threadsafe_function,可以实现ArkTS/JS和C++之间的高效通信,同时保持线程安全性。

napi_threadsafe_function_release_mode

该枚举类型定义了两个常量,用于指定以哪一种方式来释放线程安全函数。

typedef enum {
  napi_tsfn_release,
  napi_tsfn_abort
} napi_threadsafe_function_release_mode;

该值会传给napi_release_threadsafe_function。

napi_release_threadsafe_function(napi_threadsafe_function func,
                                 napi_threadsafe_function_release_mode mode);
  • mode值为napi_tsfn_release时:表示将tsfn中持有的线程数减一,当线程数减到0时,线程安全函数tsfn将被销毁。

  • mode值为napi_tsfn_abort时:该tsfn关闭,不能再调用此tsfn。

    如果设置为napi_tsfn_abort,利用napi_call_threadsafe_function接口调用此tsfn时,该行为可能导致UAF问题————当napi_tsfn_abort被设置时,tsfn立刻关闭,不能再被调用。如果此时调用napi_call_threadsafe_function,系统可能会返回napi_closing状态,表示tsfn正在关闭,但是传递给tsfn的data并未被放入队列中,这意味着data可能未被正确处理。如果data指向的内存已经被释放(例如,tsfn的资源被释放),但调用者仍然尝试访问或使用data,就会出现UAF(Use-After-Free)问题。

napi_threadsafe_function_call_mode

该枚举类型定义了两个常量,用于指定线程安全函数的调用模式。

数据结构如下所示:

typedef enum {
  napi_tsfn_nonblocking,
  napi_tsfn_blocking
} napi_threadsafe_function_call_mode;
  • napi_tsfn_nonblocking:napi_call_threadsafe_function是非阻塞的,如果队列已满,则返回napi_queue_full,从而阻止数据添加到队列中。

  • napi_tsfn_blocking:napi_call_threadsafe_function是阻塞的,直至队列中有空间可用。

2026-08-23 01:08:03