【HarmonyOS NEXT】FAQ之应用框架(NDK-任务并发调度)

1、如何在Native侧C++子线程直接调用ArkTS接口,不用通过ArkTS侧触发回调

A:暂不支持在c++子线程调用ArkTS接口,当前只能通过callback异步调用或者线程安全的方式进行回调处理。具体使用方法可参考链接

2、ArkTS层调用Native层接口时的线程相关问题
  • ArkTS层按钮点击后,调用Native层接口时,Native层代码是在主线程中执行吗?

  • 在Native层中调用其它SO的逻辑时,切到主线程后进行回调,回调时是否有方法再切回原来的线程?

A:回答如下

  • 通过按钮点击事件调用Native层的接口时,Native层代码是在主线程中执行的。

  • 如果需要在回调中切回到特定线程,可以考虑使用线程间通信机制,如消息队列、事件触发等方式(在回调中向目标线程发送消息或事件,触发目标线程执行相应的处理逻辑)。

3、Native侧获取env具有线程限制,如何在C++子线程触发ArkTS侧回调

A:可以通过线程安全函数实现在C++子线程触发ArkTS侧回调。native主线程外的其他线程通常不能直接使用需要napi_env、napi_value的NAPI函数,线程安全函数可以在其他线程中被调用,并回到主线程中执行。

4、如何在Native侧调用ArkTS侧异步方法,并获取异步计算结果到Native侧

A:该场景诉求可以通过在Native侧获取ArkTS侧Promise对象来实现。具体步骤如下:

  • ArkTS侧实现:

    1. 调用Native接口时,传入callback回调。在该回调中通过构造函数创建Promise对象;

    2. 在Promise构造函数的参数回调中,实现异步操作,并根据操作结果,调用resolve或者reject接口,用以对Promise对象进行状态迁移。

  • Native侧实现:

    1. 定义Promise对象then属性的回调方法,用以处理ArkTS侧异步计算结果;

    2. 定义Promise对象catch属性的回调方法,用以处理ArkTS侧异步计算异常信息;

    3. 在Native接口实现中,通过napi_call_function接口执行ArkTS侧传入的callback回调,获取Promise对象;

    4. 通过napi_get_named_property接口获取Promise对象中的then和catch属性;

    5. 通过napi_create_function接口将上述定义的then和catch属性C++回调方法转换为ArkTS函数对象;

    6. 通过napi_call_function接口执行then和catch属性对应ArkTS函数对象,用以处理ArkTS侧的异步计算结果和异常信息。类似于在ArkTS侧调用promise.then(()=>{}和promise.catch(()=>{}。

5、基于libuv异步库进行线程通信

A:解决措施

  1. 从ArkTS层注册UI层的处理函数到C++层,该处理函数为UI的刷新处理函数,C++层收到该注册处理后,存储env信息与处理函数为全局变量。

  2. C++层建立的大量子线程,其各子线程的处理函数中业务处理完毕后,通过调用libuv接口(如uv_queue_work)抛ArkTS任务到loop中执行。

  3. 在uv_queue_work中组装信息,返回给第一步中注册的函数来作UI刷新。

6、Native侧代码与ArkTS侧的代码线程关系以及线程使用限制

A:应用侧调用的ArkTS接口代码与Native接口代码均运行在ArkTS主线程中。在Native侧用户可以抛任务到TaskPool线程池中,TaskPool内部会根据硬件条件、任务负载等情况动态调整线程数量,以确保高优先级任务的及时执行。

7、napi_env、napi_value实例是否可以跨worker线程共享

A:napi_env、napi_value等实例在不同的worker中是不共享的。如果在C++ 中静态持有这些对象,并且主线程和worker都会访问这些对象,会出现混乱的情况。为了避免这种情况,建议在每个worker中使用独立的napi_env、napi_value等实例,而不是在C++ 代码中静态持有它们。

8、Native侧的napi_env是否支持延迟调用或者异步调用

问:

  1. 对于同一个ArkTS线程对应的c++对象,将evn保存起来,若干时间后再使用是否会有问题。

  2. 通过ArkTS端调用napi函数注册ArkTS端函数,然后napi层延迟或者异步调用这个注册的函数会有什么问题?(将这个函数napi_create_reference引用计数持有)。

A:解决如下

  1. 保存主线程的env,在主线程中使用该env,任何时候使用,不会存在问题,因为是在同一线程里。

  2. 无论是延迟调用,还是异步调用,只要调用的地方是在主线程里,就不会有问题,在非主线程才会有问题。

更多详情查看 :文档中心

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值