鸿蒙HarmonyOS应用开发之Node-API常见问题

399 篇文章 0 订阅
396 篇文章 1 订阅

ArkTS/JS侧import xxx from libxxx.so后,使用xxx报错显示undefined/not callable

  1. 排查.cpp文件在注册模块时的模块名称与so的名称匹配一致。 如模块名为entry,则so的名字为libentry.so,napi_module中nm_modname字段应为entry,大小写与模块名保持一致。

  2. 排查so是否加载成功。 应用启动时过滤模块加载相关日志,重点搜索"dlopen"关键字,确认是否有相关报错信息;常见加载失败原因有权限不足、依赖so加载失败以及加载路径错误等。

  3. 排查依赖的so是否加载成功。 确定所依赖的其它so是否打包到应用中以及是否有权限打开。

  4. 排查模块导入方式与so路径是否对应。 若JS侧导入模块的形式为: import xxx from ‘@ohos.yyy.zzz’,则该so将在/system/lib/module/yyy中找libzzz.z.so或libzzz_napi.z.so,若so不存在或名称无法对应,则报错日志中会出现dlopen相关日志。

注意,32位系统路径为/system/lib,64位系统路径为/system/lib64。

接口执行结果非预期,日志显示occur exception need return

部分Node-API接口在调用结束前会进行检查,检查虚拟机中是否存在JS异常。如果存在异常,则会打印出occur exception need return日志,并打印出检查点所在的行号,以及对应的Node-API接口名称。

解决此类问题有以下两种思路:

  • 若该异常开发者不关心,可以选择直接清除。 可直接使用napi接口napi_get_and_clear_last_exception,清理异常。调用时机:在打印occur exception need return日志的接口之前调用。

  • 将该异常继续向上抛到ArkTS层,在ArkTS层进行捕获。 发生异常时,可以选择走异常分支, 确保不再走多余的Native逻辑 ,直接返回到ArkTS层。

napi_value和napi_ref的生命周期有何区别

  • native_value由HandleScope管理,一般开发者不需要自己加HandleScope(uv_queue_work的complete callback除外)。

  • napi_ref由开发者自己管理,需要手动delete。

Node-API接口返回值不是napi_ok时,如何排查定位

Node-API接口正常执行后,会返回一个napi_ok的状态枚举值,若napi接口返回值不为napi_ok,可从以下几个方面进行排查。

  • Node-API接口执行前一般会进行入参校验,首先进行的是判空校验。在代码中体现为:
CHECK_ENV: env判空校验
CHECK_ARG:其它入参判空校验
  • 某些Node-API接口还有入参类型校验。比如napi_get_value_double接口是获取JS number对应的C double值,首先就要保证的是:JS value类型为number,因此可以看到相关校验。
RETURN_STATUS_IF_FALSE(env, nativeValue->TypeOf() == NATIVE_NUMBER, napi_number_expected);
  • 还有一些接口会对其执行结果进行校验。比如napi_call_function这个接口,其功能是执行一个JS function,当JS function中出现异常时,Node-API将会返回napi_pending_exception的状态值。
auto resultValue = engine->CallFunction(nativeRecv, nativeFunc, nativeArgv, argc); 
RETURN_STATUS_IF_FALSE(env, resultValue != nullptr, napi_pending_exception)
  • 还有一些状态值需要根据相应Node-API接口具体分析:确认具体的状态值,分析这个状态值在什么情况下会返回,再排查具体出错原因。

为了能让大家更好的学习鸿蒙(HarmonyOS NEXT)开发技术,这边特意整理了《鸿蒙开发学习手册》(共计890页),希望对大家有所帮助:https://qr21.cn/FV7h05

《鸿蒙开发学习手册》:

如何快速入门:https://qr21.cn/FV7h05

  1. 基本概念
  2. 构建第一个ArkTS应用
  3. ……

开发基础知识:https://qr21.cn/FV7h05

  1. 应用基础知识
  2. 配置文件
  3. 应用数据管理
  4. 应用安全管理
  5. 应用隐私保护
  6. 三方应用调用管控机制
  7. 资源分类与访问
  8. 学习ArkTS语言
  9. ……

基于ArkTS 开发:https://qr21.cn/FV7h05

  1. Ability开发
  2. UI开发
  3. 公共事件与通知
  4. 窗口管理
  5. 媒体
  6. 安全
  7. 网络与链接
  8. 电话服务
  9. 数据管理
  10. 后台任务(Background Task)管理
  11. 设备管理
  12. 设备使用信息统计
  13. DFX
  14. 国际化开发
  15. 折叠屏系列
  16. ……

鸿蒙开发面试真题(含参考答案):https://qr18.cn/F781PH

鸿蒙开发面试大盘集篇(共计319页):https://qr18.cn/F781PH

1.项目开发必备面试题
2.性能优化方向
3.架构方向
4.鸿蒙开发系统底层方向
5.鸿蒙音视频开发方向
6.鸿蒙车载开发方向
7.鸿蒙南向开发方向

  • 17
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
在对Node-RED源代码中的editor-api模块进行分析前,我们需要了解Node-RED是一个基于Node.js的流程编程工具,通过编写流程来实现不同设备之间的连接和通讯。editor-api模块是Node-RED的一个子模块,负责提供与流程编辑器相关的API接口。 首先,editor-api模块的代码位于Node-RED的`red/runtime/editor-api.js`文件中。该模块主要提供了一些用于流程编辑器的API接口,包括获取和更新流程信息、节点信息、连接信息等等。 在代码中,首先定义了一个`EditorAPI`类,该类通过`RED`对象的`comms`模块来工作。`comms`模块用于处理流程编辑器的通信和发送消息。 接着,在`EditorAPI`类中定义了一系列的方法,用来对流程、节点和连接等信息进行操作。其中一些重要的方法包括: - `getFlows`:用于获取当前所有流程的信息。 - `getFlow`:根据流程ID获取特定流程的信息。 - `getFlowTab`:根据流程ID获取对应的流程tab,用于在编辑器中显示和操作流程。 - `updateFlow`:用于更新特定流程的信息。 - `getNode`:根据节点ID获取节点的信息。 - `addNode`:用于在流程中添加新的节点。 - `getConnections`:获取当前所有节点的连接信息。 通过这些方法,开发者可以方便地对流程进行增加、删除、修改等操作,并在编辑器中进行实时的反馈。 此外,还有一些与编辑器的交互相关的方法,比如`selectTab`方法用于切换当前编辑的流程tab,`resize`方法用于调整编辑器的大小等。 总的来说,editor-api模块的代码分析主要围绕着提供与流程编辑器相关的API接口展开,给开发者提供了一种方便灵活的方式来操作和管理流程及其相关信息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值