积分582 / 贡献0

提问0答案被采纳0文章52

[经验分享] N-API不生效问题分析报告 原创

Laval社区小助手 显示全部楼层 发表于 2024-4-1 14:06:49

1 关键字

N-API;OpenHarmony;

2 问题描述

问题现象:OpenHarmony系统上运行JS/C++应用,出现N-API封装的c++函数调用不了,运行异常的问题

测试步骤:

  1. 使用hdc将封装好C++函数的hap包安装到搭载OpenHarmony的设备上
  2. 运行应用
  3. 点击NapiTest按钮
  4. 期望出现123+456的运算结果,但是点击无响应

3 问题原因

3.1 正常机制

  • OpenHarmony下实现JS与C/C++通信,需要通过NAPI接口来注册模块并导出模块的入口函数,并随着OpenHarmony的源码一起编译出镜像,然后烧录到设备中。
  • 此时就可以在此设备上通过ets import相应的模块,来调用C/C++模块了。

3.2 异常机制

  • 期望在OpenHarmony的设备上,使用JS与C/C++通信。
  • 将HarmonyOS SDK编译出来的hap包,运行到模拟器上,测试发现js代码能调用到hap包内的so模块。
  • 将hap包签名后安装到OpenHarmony的设备上,发现js代码不能调用到hap包内的so模块。
  • OpenHarmony是通过js调用系统内的so模块,而上述方式是调用应用内的so模块。

4 解决方案

5 定位过程

该问题为典型的不了解HarmonyOS与OpenHarmony区别,从sdk与编译方面看:

  • HarmonyOS与OpenHarmony的hap包无法混用。
  • HarmonyOS支持运行Java、native、js编写的应用程序。
  • OpenHarmony支持js、ets编写的应用程序。
  • HarmonyOS中的napi为调用hap包内的so模块,OpenHarmony则需要烧录到设备中供应用调用。
  • 在DevEco中暂未提供OpenHarmony的模拟器,只有搭载HarmonyOS的模拟器。
  • OpenHarmony构建的hap包只包含资源文件与编译后的JS文件,HarmonyOS则可能包含编译后的class文件、so文件及js文件。

当用户提出模拟器上运行正常,开发板不行后,应该能立马判断出用户使用的是HarmonyOS SDK的工程。在尝试将HarmonyOS构建的hap包签名并成功安装到开发板上后,基本能肯定客户是将HarmonyOS中的应用当成了OpenHarmony的应用,而两者在napi的机制上完全不一样,因此理所当然的会出现模拟器正常,开发板不正常的问题。

6 知识分享

  • HarmonyOS的通过js编写的应用,只要js中不调用java或者native,理论上可以运行在OpenHarmony上。
  • HarmonyOS与OpenHarmony的hap包结构类似,无非就是多了编译后的java/c代码

©著作权归作者所有,转载或内容合作请联系作者

您尚未登录,无法参与评论,登录后可以:
参与开源共建问题交流
认同或收藏高质量问答
获取积分成为开源共建先驱

Copyright   ©2023  OpenHarmony开发者论坛  京ICP备2020036654号-3 |技术支持 Discuz!

返回顶部