OpenHarmony开发者论坛
标题:
N-API不生效问题分析报告
[打印本页]
作者:
Laval社区小助手
时间:
2024-4-1 14:06
标题:
N-API不生效问题分析报告
[md]# 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 解决方案
* 参考[NAPI官方文档](
https://link.csdn.net/?target=ht ... 3Flogin%3Dfrom_csdn
)
# 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代码
[/md]
欢迎光临 OpenHarmony开发者论坛 (https://forums.openharmony.cn/)
Powered by Discuz! X3.5