electron 上怎么用node 调用 c++ 提供的方法

server/2025/1/12 16:43:29/

背景

在 Electron 上调用 C++ 代码的场景主要出现在需要执行高性能、低延迟的任务,或者需要与现有的本地 C++ 库集成时。这些场景往往涉及底层系统交互、性能优化或跨平台兼容性需求。
我们都知道c++ 的性能和安全性都比JavaScript 要高,但我认为在 Electron 中调用 C++ 代码是一种强大的技术,但仅在以下情况下才值得考虑:

  1. 任务对性能要求极高
  2. 必须访问底层系统或硬件
  3. 需要集成已有的 C++ 库。

调用方法

WebAssembly

  1. emcc 是 Emscripten 工具链的一部分,用于将 C 和 C++ 代码编译为 WebAssembly(WASM)或 asm.js。如果想要自己尝试编译的小伙伴可以看看 这里
  2. 代码实现:
#include <iostream>
extern "C"
{int add(int a, int b){return a + b;}
}

假设我们有这样一个 c++ 提供的方法,用于计算两个整数的和,我们可以用过命令 emcc add.cpp -s WASM=1 -s EXPORTED_FUNCTIONS="['_add']" -o add.js 进行编译,就能得到一个 add.wasm 文件了。
然后我们就可以通过 fs 中的 readFileSync 方法来读取啦。

javascript">const source = fs.readFileSync('src/cpp/add.wasm')
WebAssembly.instantiate(source).then(({ instance }) => {const exports = instance.exportsconsole.log(exports)const result = exports.add(10, 2)console.log(result) // 输出: 12
})

输出就如下啦:
在这里插入图片描述

在 Node.js 中,WebAssembly 是一个内置功能,你可以直接在全局变量下使用 WebAssembly,不需要额外导入。Node.js 版本 8 及更高版本都支持 WebAssembly

  1. emcc
    emcc 是 Emscripten 的命令行工具,用于将 C/C++ 代码编译成 WebAssembly 或 JavaScript。Emscripten 是一个将 C/C++ 代码编译成可以在 web 浏览器中运行的代码或 WebAssembly 的工具链。
  2. add.cpp
    这是你要编译的源代码文件的名称。它是 C++ 文件,包含你想要转换为 WebAssembly 的函数和逻辑。
  3. -s WASM=1
    这个选项用于指示 Emscripten 编译器生成 WebAssembly 输出。这意味着程序将被编译为 .wasm 文件,而不是 JavaScript。这是集成 WebAssembly 的关键参数。
  4. -s EXPORTED_FUNCTIONS=“[‘_add’]”
    这个选项指定了要导出的函数。只有在这个列表中的函数才能在 WebAssembly 模块外部访问。EXPORTED_FUNCTIONS 参数是一个数组,包括你想让外部 JavaScript 代码调用的函数名称。
    在这个例子中,‘_add’ 是 C++ 代码中定义的要导出的函数的名称。注意,函数名需要以 _ 开头,这是 Emscripten 的要求。
  5. -o add.js
    这个选项指定了输出文件的名称和格式。在这个例子中,add.js 是将生成的 JavaScript 文件的名称。Emscripten 会生成两个文件:
  • add.wasm: WebAssembly 二进制文件,包含你的 C++ 逻辑。
  • add.js: JavaScript 文件,用于加载和处理 WebAssembly 模块。

总结
命令 emcc add.cpp -s WASM=1 -s EXPORTED_FUNCTIONS="['_add']" -o add.js 的整体作用是:

  • 编译 add.cpp 源文件。
  • 生成 WebAssembly 输出。
  • 导出 _add 函数以供 JavaScript 代码调用。
  • 将输出文件命名为 add.js,同时生成相关的 WebAssembly 文件。

通过子进程调用

  1. 编译 C++ 程序: 假设你的 C++ 程序是 hello.cpp:
#include <iostream>
int main() {std::cout << "Hello from C++!" << std::endl;return 0;
}
  1. 使用 node 中的 child_processexecFile 方法,直接执行
javascript">import { execFile } from 'child_process'
execFile('/my-app/src/cpp/hello',(error, stdout, stderr) => {if (error) {console.error(`Error: ${error.message}`)return}if (stderr) {console.error(`Stderr: ${stderr}`)return}console.log(`Output: ${stdout}`)}
)

http://www.ppmy.cn/server/157801.html

相关文章

【翻译】2025年华数杯国际赛数学建模题目+翻译pdf自取

保存至本地网盘 链接&#xff1a;https://pan.quark.cn/s/f82a1fa7ed87 提取码&#xff1a;6UUw 2025年“华数杯”国际大学生数学建模竞赛比赛时间于2025年1月11日&#xff08;周六&#xff09;06:00开始&#xff0c;至1月15日&#xff08;周三&#xff09;09:00结束&#xff…

跟着问题学3.3——Faster R-CNN详解及代码实战

Fast R-CNN的不足 选取区域使用的算法是固定的&#xff0c;不参与学习选取区域的算法本身消耗比较高 (搜索选择法)选取区域的算法选出来的区域大部分都是重合的&#xff0c;并且只有很小一部分包含我们想要识别的对象区域范围的精度比较低 (即使经过调整)判断分类有时只能使用…

牛客网刷题 ——C语言初阶(6指针)——BC106 上三角矩阵判定

1. 题目描述——BC106 上三角矩阵判定 牛客网OJ题链接 描述 KiKi想知道一个n阶方矩是否为上三角矩阵&#xff0c;请帮他编程判定。上三角矩阵即主对角线以下的元素都为0的矩阵&#xff0c;主对角线为从矩阵的左上角至右下角的连线。 示例 输入&#xff1a; 3 1 2 3 0 4 5 0 0…

【Uniapp-Vue3】watch和watchEffect监听的使用

想要使用watch监听需要引入watch&#xff1a; import {watch} from "vue"; 监听某一个变量&#xff08;浅层监听&#xff09;&#xff1a; watch(变量名, (newValue, oldValue)>{...}) 我们监听变量num&#xff0c;通过输入input去改变num的值&#xff1a; 监听对…

Spring AI ChatClient

Spring AI中的ChatClient是一个提供流畅API&#xff08;Fluent API&#xff09;的客户端&#xff0c;它主要用于与各种AI模型进行通信。ChatClient 提供了与 AI 模型通信的 Fluent API&#xff0c;它支持同步和反应式&#xff08;Reactive&#xff09;编程模型。与 ChatModel、…

CDA数据分析师一级经典错题知识点总结(3)

1、SEMMA 的基本思想是从样本数据开始&#xff0c;通过统计分析与可视化技术&#xff0c;发现并转换最有价值的预测变量&#xff0c;根据变量进行构建模型&#xff0c;并检验模型的可用性和准确性。【强调探索性】 2、CRISP-DM模型Cross Industry Standard Process of Data Mi…

嵌入式C语言:二维数组

目录 一、二维数组的定义 二、内存布局 2.1. 内存布局特点 2.2. 内存布局示例 2.2.1. 数组元素地址 2.2.2. 内存布局图&#xff08;简化表示&#xff09; 2.3. 初始化对内存布局的影响 三、访问二维数组元素 3.1. 常规下标访问方式 3.2. 通过指针访问 3.2.1. 指向数…

用JAVA 源码角度看 客户端请求服务器流程中地址是域名情况下解析域名流程

1. 域名解析的入口点 getaddrinfo 或 getAllByName 方法&#xff1a;在底层&#xff0c;Java 使用 getaddrinfo&#xff08;在 Unix-like 系统中&#xff09;或类似的系统调用来解析域名。在 Java 的 InetAddress 类中&#xff0c;getAllByName 方法是解析域名的入口点之一。它…