electron-napi-library 文件夹是鸿蒙平台上 Electron 与 N-API 原生模块之间的适配层。它解决了在鸿蒙(OpenHarmony)系统上运行 Electron 应用时,原生模块(如 node-sqlite3)的兼容性问题。将 Electron/Node.js 的完整头文件体系(特别是 libuv 和 Node-API)重新组织后,与 libshim.a 一起提供的一个适配包。
| 头文件位置 | node_modules/node-addon-api | electron_node/ 目录 |
| libuv 头文件 | ||
| Node-API 头文件 | ||
| 实现库 | libshim.a(提供鸿蒙实现) |
通过将头文件放在 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,这个头文件是鸿蒙适配版本。
libuv 是 Node.js/Electron 的事件循环库。这里提供了所有平台的 libuv 头文件(unix.h、linux.h、win.h 等),但实际编译时只会使用鸿蒙需要的部分。
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 中的实现]}]}
说明:
electron-napi-library 是一个完整的鸿蒙适配包,不仅仅是几个文件
它模拟了 Electron/Node.js 的头文件布局,让原生模块编译时能找到正确的头文件
libshim.a 是核心,提供了所有 N-API 和 libuv 符号的鸿蒙平台实现
HIDE_NAPI_AND_UV 宏的作用:告诉编译器不要使用系统/Electron 自带的 N-API 符号,而是使用 libshim.a 中提供的符号