wasm 学习笔记,写个求和demo
最近由于工作内容需要,正好学习了一下wasm(WebAssembly 的缩写)。下面通过一个例子说明如何使用:
c++ 写的方法打包成wasm文件后,js如何调用里面方法:
要将C++ 写好的方法打包成 wasm 文件,并在 JavaScript 中调用其中的方法,可以按照以下步骤进行:
-
首先,使用 Emscripten 工具链将 C++ 代码编译成 wasm 文件。Emscripten 是一个常用的工具,可以将 C/C++ 代码编译成 WebAssembly 格式。你可以访问 Emscripten 的官方网站获取更多信息和文档:https://emscripten.org/
-
在 JavaScript 中,可以使用 WebAssembly JavaScript API 来加载和调用 wasm 文件中的函数。你可以使用
WebAssembly.instantiateStreaming
或WebAssembly.instantiate
方法来加载 wasm 文件,并获取其中导出的函数。 -
在 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