wasm 学习笔记,写个求和demo

最近由于工作内容需要,正好学习了一下wasm(WebAssembly 的缩写)。下面通过一个例子说明如何使用:

c++ 写的方法打包成wasm文件后,js如何调用里面方法:

要将C++ 写好的方法打包成 wasm 文件,并在 JavaScript 中调用其中的方法,可以按照以下步骤进行:

  1. 首先,使用 Emscripten 工具链将 C++ 代码编译成 wasm 文件。Emscripten 是一个常用的工具,可以将 C/C++ 代码编译成 WebAssembly 格式。你可以访问 Emscripten 的官方网站获取更多信息和文档:https://emscripten.org/

  2. 在 JavaScript 中,可以使用 WebAssembly JavaScript API 来加载和调用 wasm 文件中的函数。你可以使用 WebAssembly.instantiateStreamingWebAssembly.instantiate 方法来加载 wasm 文件,并获取其中导出的函数。

  3. 在 JavaScript 中调用 wasm 文件中的函数,可以通过获取导出的函数对象,并直接调用这些函数来实现。

下面是一个简单的示例代码演示如何加载 wasm 文件并调用其中的函数:

// example.cpp文件
#include <emscripten/emscripten.h>

extern "C" {
    EMSCRIPTEN_KEEPALIVE
    int add(int a, int b) {
        return a + b;
    }
}

在这个示例中,定义了一个简单的 add 函数,用于计算两个整数的和。使用 EMSCRIPTEN_KEEPALIVE 宏来告诉 Emscripten 将该函数导出到 wasm 模块中,以便 JavaScript 可以调用它。

接下来使用 Emscripten 工具链将这个 C++ 代码编译成 wasm 文件。使用类似以下命令来进行编译:

emcc example.cpp  -o example.js -s EXPORTED_FUNCTIONS="['_add']"

在这个命令中,example.cpp C++ 源文件,example.js是输出的 JavaScript 文件,_add 是要导出的函数名称。

完成编译后,将得到一个包含 wasm 模块的 JavaScript 文件,可以在你的 HTML 文件中引入并调用其中的函数。

// index.html文件
<!DOCTYPE html>
<html>
<head>
    <title>WebAssembly Demo</title>
</head>
<body>
    <script>
        fetch('./example.wasm')
            .then(response => response.arrayBuffer())
            .then(bytes => WebAssembly.instantiate(bytes, {}))
            .then(results => {
                const { add } = results.instance.exports;
                const sum = add(5, 6);
                console.log('Sum:', sum); //浏览器控制台会打印出11
            });
    </script>
</body>
</html>

add是在 C++ 代码中导出的函数名称。

参考链接:https://juejin.cn/post/7259182371974266936?searchId=202403181758005AB9851DB9A8A52DF80C

posted @ 2024-03-20 11:36  imsomnus  阅读(74)  评论(0编辑  收藏  举报