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

打印 上一主题 下一主题

主题 1003|帖子 1003|积分 3011

背景

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

  • 使命对性能要求极高
  • 必须访问底层体系或硬件
  • 需要集成已有的 C++ 库。
调用方法

WebAssembly


  • emcc 是 Emscripten 工具链的一部门,用于将 C 和 C++ 代码编译为 WebAssembly(WASM)或 asm.js。假如想要自己尝试编译的小伙伴可以看看 这里
  • 代码实现:
  1. #include <iostream>
  2. extern "C"
  3. {
  4.   int add(int a, int b)
  5.   {
  6.     return a + b;
  7.   }
  8. }
复制代码
假设我们有这样一个 c++ 提供的方法,用于盘算两个整数的和,我们可以用过下令 emcc add.cpp -s WASM=1 -s EXPORTED_FUNCTIONS="['_add']" -o add.js 进行编译,就能得到一个 add.wasm 文件了。
然后我们就可以通过 fs 中的 readFileSync 方法来读取啦。
  1. const source = fs.readFileSync('src/cpp/add.wasm')
  2. WebAssembly.instantiate(source).then(({ instance }) => {
  3.   const exports = instance.exports
  4.   console.log(exports)
  5.   const result = exports.add(10, 2)
  6.   console.log(result) // 输出: 12
  7. })
复制代码
输出就如下啦:

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

  • emcc
    emcc 是 Emscripten 的下令行工具,用于将 C/C++ 代码编译成 WebAssembly 或 JavaScript。Emscripten 是一个将 C/C++ 代码编译成可以在 web 浏览器中运行的代码或 WebAssembly 的工具链。
  • add.cpp
    这是你要编译的源代码文件的名称。它是 C++ 文件,包含你想要转换为 WebAssembly 的函数和逻辑。
  • -s WASM=1
    这个选项用于指示 Emscripten 编译器天生 WebAssembly 输出。这意味着步伐将被编译为 .wasm 文件,而不是 JavaScript。这是集成 WebAssembly 的关键参数。
  • -s EXPORTED_FUNCTIONS=“[‘_add’]”
    这个选项指定了要导出的函数。只有在这个列表中的函数才气在 WebAssembly 模块外部访问。EXPORTED_FUNCTIONS 参数是一个数组,包括你想让外部 JavaScript 代码调用的函数名称。
    在这个例子中,‘_add’ 是 C++ 代码中界说的要导出的函数的名称。留意,函数名需要以 _ 开头,这是 Emscripten 的要求。
  • -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 文件。
  通过子进程调用


  • 编译 C++ 步伐: 假设你的 C++ 步伐是 hello.cpp:
  1. #include <iostream>
  2. int main() {
  3.     std::cout << "Hello from C++!" << std::endl;
  4.     return 0;
  5. }
复制代码

  • 利用 node 中的 child_process 的 execFile 方法,直接实行
  1. import { execFile } from 'child_process'
  2. execFile('/my-app/src/cpp/hello',
  3.   (error, stdout, stderr) => {
  4.     if (error) {
  5.       console.error(`Error: ${error.message}`)
  6.       return
  7.     }
  8.     if (stderr) {
  9.       console.error(`Stderr: ${stderr}`)
  10.       return
  11.     }
  12.     console.log(`Output: ${stdout}`)
  13.   }
  14. )
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

用多少眼泪才能让你相信

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表