napi_value是一个C的结构体指针,表示一个ArkTS/JS对象的引用。对于初学者来说,学习鸿蒙开发如何来入门比较好?
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是阻塞的,直至队列中有空间可用。