相关问题
HarmonyOS Navigator的使用场景
73浏览 • 1回复 待解决
关于emitter、eventHub的使用场景
2659浏览 • 1回复 待解决
请问ArkTS中this使用场景是什么?
2012浏览 • 1回复 待解决
HarmonyOS Navigation和router的使用场景
429浏览 • 2回复 待解决
ArkGraphics 2D都有哪些使用场景?
651浏览 • 1回复 待解决
HAR和HSP的使用场景区分
432浏览 • 1回复 待解决
#鸿蒙通关秘籍#loadNativeModule接口有哪些使用场景?
123浏览 • 1回复 待解决
HarmonyOS 针对API12:组件使用场景dialog
82浏览 • 1回复 待解决
HarmonyOS Array和ArrayList的区别及使用场景?
64浏览 • 1回复 待解决
UIAbility与UIExtensionAbility的使用场景上有什么区别
1684浏览 • 1回复 待解决
Oceanbase与DRDS的关系与使用场景的区别?
3869浏览 • 1回复 待解决
共享包HSP内容访问,它的使用场景是什么?
876浏览 • 1回复 待解决
应用启动框架AppStartup应用场景分析
554浏览 • 1回复 待解决
#鸿蒙学习大百科#Ability Kit都有哪些使用场景?
346浏览 • 1回复 待解决
使用NAPI扩展TS接口时,常用属性和实现接口的基本用法
2004浏览 • 0回复 待解决
有哪些应用场景?
3732浏览 • 1回复 待解决
HarmonyOS onDidBuild的作用和应用场景
99浏览 • 1回复 待解决
#鸿蒙通关秘籍#TaskPool和Worker的使用场景及区别有何不同?
80浏览 • 1回复 待解决
鸿蒙系统中的`RemoteView`有哪些应用场景?
211浏览 • 0回复 待解决
基于mysql的悲观锁的运用场景?
2638浏览 • 1回复 待解决
JSVM-API的应用场景有哪些?
426浏览 • 1回复 待解决
router和Navigation的技术选择、推荐使用场景和演进策略是什么
2083浏览 • 1回复 待解决
BackupExtensionAbility 是否有具体使用范例代码,或者具体描述一下这个的使用场景
1749浏览 • 1回复 待解决
#鸿蒙学习大百科#Performance Analysis Kit的主要使用场景有哪些?
273浏览 • 1回复 待解决
#鸿蒙通关秘籍#鸿蒙画中画功能的主要使用场景有哪些?
70浏览 • 1回复 待解决
一. native 与 ts 异步调用 (async_library)
1.1 通过libuv接口
通过libuv 的方式将JS任务抛到loop中执行,即回到主线程执行
(1)定义变量保存env
(2)js线程保存env
[in] env:调用 API 的环境。
[in] cbinfo:传递给回调函数的回调信息。
[in-out] argc:指定所提供的 argv 数组的长度并接收参数的实际计数。argc 可以选择性地通过传递 NULL 来忽略。
[out] argv:参数将被复制到的 napi_value 的 C 数组。如果参数数量多于提供的数量,则只复制请求数量的参数。如果提供的参数比声明的少,则 argv 的其余部分将填充代表 undefined 的 napi_value 值。argv 可以选择性地通过传递 NULL 来忽略。
[out] thisArg:接收调用的 JavaScript this 参数。thisArg 可以选择性地通过传递 NULL 来忽略。
[out] data:接收回调的数据指针。data 可以选择性地通过传递 NULL 来忽略。
[in] env:调用 API 的环境。
[in] value:正在为其创建引用的 napi_value。
[in] initial_refcount:新引用的初始引用计数。
[out] result:napi_ref 指向新的引用。
(3) 调用libuv接口抛JS任务到loop中执行。
在JavaScript中,通常使用事件循环(event loop)来处理异步任务。事件循环是一种机制,它允许JavaScript引擎处理多个任务并按照它们的优先级执行。事件循环主要由一个无限循环组成,该循环会不断地从任务队列中取出任务并执行。 当一个异步任务被触发时,它会被添加到任务队列中。任务队列是一个先进先出的队列,即先添加到队列中的任务先被执行。在JavaScript中,有多种类型的任务队列,例如宏任务队列和微任务队列。 loop指的是事件循环的这个无限循环,它不断地从任务队列中取出任务并执行,直到任务队列为空。当所有任务都被执行完毕后,事件循环会暂停,等待新的任务被添加到任务队列中。
1.2通过napi_create_async_work方式
napi_create_async_work接口说明
[in] env:调用 API 的环境。
[in] async_resource:与将传递给可能的 async_hooks init 钩子的异步工作关联的可选对象。
[in] async_resource_name:为 async_hooks API 公开的诊断信息提供的资源类型的标识符。
[in] execute:应调用以异步执行逻辑的原生函数。给定的函数从工作池线程调用,可以与主事件循环线程并行执行。
[in] complete:异步逻辑完成或取消时将调用的原生函数。从主事件循环线程调用给定的函数。napi_async_complete_callback提供了更多详细信息。
[in] data:用户提供的数据上下文。这将被传递回执行和完成功能。
[out] result:napi_async_work* 是新创建的异步工作的句柄。
使用callback回调
定义一个变量用于数据的传递
(1)执行异步任务回调:
(2)异步任务完成回调:
(3)napi_create_async_work 创建异步任务
使用 promise 回调
全局的变量
()执行异步任务回调:
()异步任务完成的回调:
1. 创建异步任务
二、native 与ts 同步调用(sync_library)
2.1 JS 和 C++ 相互调用ArrayBuffer 的方式
[in] env:调用 API 的环境。
[in] length:要创建的数组缓冲区的字节长度。
[out] data:指向 ArrayBuffer 的底层字节缓冲区的指针。data 可以选择性地通过传递 NULL 来忽略。
[out] result:代表 JavaScript ArrayBuffer 的 napi_value。
[in] env:调用 API 的环境。
[in] type:TypedArray 中元素的标量数据类型。
[in] length:TypedArray 中的元素数。
[in] arraybuffer:ArrayBuffer 是类型化数组的基础。
[in] byte_offset:ArrayBuffer 中开始投影 TypedArray 的字节偏移量。
[out] result:代表 JavaScript TypedArray 的 napi_value。
传到js 层
2.1.2 ts 数组传到napi 层
2.2.2 native 与ts 相互调用
TS 层对象
C++ 侧接受传入的JTS对象,并在C++ 层创建对象作为JS对象的函数参数传给JS层
TS 侧调用如下: