包装 C/C++,提供给 JAVA/JavaScript/Python 调用

为什么跨语言编程

  1. C/C++效率高
  2. 复用现有代码能力
  3. C/C++可以操作硬件

    方案

  4. 主流语言可以使用 swig

  5. electron 使用 ffi-napi
  6. 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 |