当前位置:首页>鸿蒙APP>做electron鸿蒙化时electron-napi-library文件夹的作用

做electron鸿蒙化时electron-napi-library文件夹的作用

  • 2026-11-08 21:03:04
做electron鸿蒙化时electron-napi-library文件夹的作用
electron-napi-library 文件夹是鸿蒙平台上 Electron 与 N-API 原生模块之间的适配层。它解决了在鸿蒙(OpenHarmony)系统上运行 Electron 应用时,原生模块(如 node-sqlite3)的兼容性问题。将 Electron/Node.js 的完整头文件体系(特别是 libuv 和 Node-API)重新组织后,与 libshim.a 一起提供的一个适配包。

与标准 Electron/Node.js 的对比

组成部分
标准 Electron/Node.js
鸿蒙 electron-napi-library
头文件位置
系统路径或 node_modules/node-addon-api
自定义 electron_node/ 目录
libuv 头文件
来自 Node.js 源码
复制并可能修改过的版本
Node-API 头文件
来自 Node.js 源码
来自 Electron 源码(可能适配过)
实现库
链接 Electron 自带的库
链接 libshim.a(提供鸿蒙实现)

1. 模拟标准 Electron/Node.js 的头文件布局

通过将头文件放在 electron_node/ 目录下,使得编译时可以这样配置:

# 让 #include<electron_node/src/node_api.h> 能正确解析]"include_dirs":["electron-napi-library/include" 

编译时,代码中的 #include <node_api.h> 会实际指向 electron-napi-library/include/electron_node/src/node_api.h,这个头文件是鸿蒙适配版本。

2. 提供完整的 libuv 头文件体系

libuv 是 Node.js/Electron 的事件循环库。这里提供了所有平台的 libuv 头文件(unix.h、linux.h、win.h 等),但实际编译时只会使用鸿蒙需要的部分。

3. libshim.a 的核心作用

libshim.a 提供了这些头文件声明的函数的具体实现(针对鸿蒙平台的实现),包括:

  • Node-API 函数(napi_*)

  • libuv 函数(uv_*)

  • 其他 Electron/Node.js 内部符号

在 binding.gyp 中的实际配置

binding.gyp 配置应该是这样的:

{  "targets": [    {      "target_name": "node_sqlite3",      "include_dirs": [        "electron-napi-library/include",           # 让 <electron_node/...> 可被找到        "electron-napi-library/include/electron_node/src",  # 直接包含 node_api.h        # ... 其他路径      ],      "libraries": [        "<(module_root_dir)/electron-napi-library/lib/libshim.a"      ],      "defines": [        "HIDE_NAPI_AND_UV"   # 隐藏标准符号,使用 shim 中的实现      ]    }  ]}

说明:

  1. electron-napi-library 是一个完整的鸿蒙适配包,不仅仅是几个文件

  2. 它模拟了 Electron/Node.js 的头文件布局,让原生模块编译时能找到正确的头文件

  3. libshim.a 是核心,提供了所有 N-API 和 libuv 符号的鸿蒙平台实现

  4. HIDE_NAPI_AND_UV 宏的作用:告诉编译器不要使用系统/Electron 自带的 N-API 符号,而是使用 libshim.a 中提供的符号

最新文章

随机文章