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