包装 C/C++,提供给 JAVA/JavaScript/Python 调用
为什么跨语言编程
- C/C++效率高
- 复用现有代码能力
-
方案
主流语言可以使用 swig
- electron 使用 ffi-napi
- node 使用 N-API/node-addon-apiI
windows 中 js 调用 C/C++ 主要方式
| 方法 | 备注 | 缺点 | 更新时间 | | —- | —- | —- | —- | | node-gyp | 衍生自 google 的 gyp,编译原生 C/C++代码为 js
官方使用的 node-gyp 编译 v8 封装的 C/C++ 代码为 js |
1. win10 编译环境复杂
1. google 用 gn 代替 gyp
| 2021.11 | | node-ffi | Foreign Function Interfac 支持低版本 v8,加载 dll,底层使用 node-gyp | 停止维护 |
| | swig | 提供主流语言调用 C/C++的能力 |
1. 没有完全支持 C++的特性
1. Node.js 支持版本过低,不识别 V8语法,导致node-gyp build 失败
1. 文档不够丰富
| 2021.11仍无支持 | | node-ffi-napi | 以 N-API 的风格修改了 node-ffi 中关于 v8 的代码 |
1. 也有停止维护的风险
1. 多线程支持的不好
1. 需要处理类型转换
| 2021.2 | | V8~~ ~~或 Node | 直接使用 Node.js 和 V8 API 来实现插件 | 大版本之间API变动过大,升级就要重新更新和编译插件 | - | | nan |
1. 基于 Node.js 和 V8 API 的 C++ 抽象对象
1. 利用大量宏,根据不同版本的Node,生成不同版本的代码,避免升级手动修改代码
| 不同的 Node.js 间使用仍然需要重新编译插件代码 | 2021.8 | | Node-API/N-API |
1. 稳定的 ABI
1. 以 C 风格提供稳定的 ABI接口
1. 消除 Node.js 版本差异
1. 消除 V8 版本差异
1. 消除 V8 和其他 JavaScript 引擎差异
| 只支持 LTS 版本的 Node.js | | | node-addon-api | 可简化基于 C 的 N-API 的使用,仅包含 C++的头文件,向下兼容不同版本的 Node.js |
| 2021.11.15 |
