📚往期学习笔录📝:
📝 鸿蒙(HarmonyOS)北向开发知识点记录~
📝 鸿蒙(OpenHarmony)南向开发保姆级知识点汇总~
📝 鸿蒙应用开发与鸿蒙系统开发哪个更有前景?
📝 嵌入式开发适不适合做鸿蒙南向开发?看完这篇你就了解了~
📝 对于大前端开发来说,转鸿蒙开发究竟是福还是祸?
📝 鸿蒙岗位需求突增!移动端、PC端、IoT到底该怎么选?
📝 记录一场鸿蒙开发岗位面试经历~
📝 持续更新中……
4. 样例工程源码剖析
- 工程的模板是
Native C++
,模型是Stage
。 - 源码剖析主要围绕以下几个文件
4.1. NAPI导出对象和生命周期管理具体实现
4.1.1. 定义NapiTest类及方法
- Napi.h文件内容如下:
#ifndef __NAPI_TEST_H__
#define __NAPI_TEST_H__
#include "napi/native_api.h"
#include <js_native_api_types.h>
#include <iostream>
#define NAPI_CLASS_NAME "NapiTestClass"
class NapiTest {
public:
NapiTest() : mEnv(nullptr), mRef(nullptr) {
}
NapiTest(napi_env env) : mEnv(env), mRef(nullptr){
}
~NapiTest();
// 创建NapiTest类的实体,并将实体返回到应用端,该方法为js创建一个类实体,因此需要将该接口对外导出
static napi_value Create(napi_env env, napi_callback_info info);
// 初始化js类并设置对应属性并将其导出
static napi_value Init(napi_env env, napi_value exports);
private:
// 设置数据,此方法给到js直接调用,因此需要将该接口对外导出
static napi_value SetMsg(napi_env env, napi_callback_info info);
// 获取数据,此方法给到js直接调用,因此需要将该接口对外导出
static napi_value GetMsg(napi_env env, napi_callback_info info);
// 定义js结构体时实际的构建函数
static napi_value Constructor(napi_env env, napi_callback_info info);
// 释放资源的函数(类似类的析构函数)
static void Destructor(napi_env env, void *nativeObject, void *finalize);
// 生命周期变量
static napi_ref sConstructor_;
// 设置和获取数据的变量
static std::string _msg;
// 记录环境变量
napi_env mEnv = nullptr;
// 记录生命周期变量
napi_ref mRef = nullptr;
};
#endif /* __NAPI_TEST_H__ */
4.1.1.1 napi_value
- Node.js Node-API的值用napi_value类型表示。
OpenHarmony NAPI将ECMAScript标准中定义的Boolean、Null、Undefined、Number、BigInt、String、Symbol和Object八种数据类型,以及函数对应的Function类型,统一封装成napi_value类型,下文中表述为JS类型,用于接收ArkUI应用传递过来的数据及返回数据给ArkUI应用。 - 这是一个不透明的指针,用于表示JavaScript值。
4.1.1.2 napi_ref
- 这是用来引用napi_value的抽象。这允许用户管理JavaScript值的生命周期,包括显式地定义它们的最小生命周期。
4.1.1.3 napi_env
- napi_env用于表示上下文,底层的Node-API实现可以使用该上下文持久保持VM-specific的状态。
4.1.2 将NapiTest类定义为js类
4.1.2.1在定义js类之前,需要先设置js类对外导出的方法
// 在定义js类之前,需要先设置类对外导出的方法
napi_property_descriptor desc[] = {
{ "getMsg",