我目前正在开发一个个人的 Node.js (>=8.0.0) 项目,需要调用 C 子程序来提高执行时间。由于需要在浏览器中打开我的最终代码,因此我尝试使用 WebAssembly 来实现。
我已经使用 Emscripten 将 C 代码编译成 WebAssembly,但不知道该如何继续操作。
如果能提供任何帮助方向,将不胜感激。谢谢!
我目前正在开发一个个人的 Node.js (>=8.0.0) 项目,需要调用 C 子程序来提高执行时间。由于需要在浏览器中打开我的最终代码,因此我尝试使用 WebAssembly 来实现。
我已经使用 Emscripten 将 C 代码编译成 WebAssembly,但不知道该如何继续操作。
如果能提供任何帮助方向,将不胜感激。谢谢!
int add(int a, int b) {
return a + b;
}
构建独立的 .wasm 文件:
emcc test.c -O2 -s WASM=1 -s SIDE_MODULE=1 -o test.wasm
在Node.js应用程序中使用.wasm文件:
const util = require('util');
const fs = require('fs');
var source = fs.readFileSync('./test.wasm');
const env = {
memoryBase: 0,
tableBase: 0,
memory: new WebAssembly.Memory({
initial: 256
}),
table: new WebAssembly.Table({
initial: 0,
element: 'anyfunc'
})
}
var typedArray = new Uint8Array(source);
WebAssembly.instantiate(typedArray, {
env: env
}).then(result => {
console.log(util.inspect(result, true, 0));
console.log(result.instance.exports._add(9, 9));
}).catch(e => {
// error caught
console.log(e);
});
TypeError: WebAssembly Instantiation: Imports argument must be present and must be an object at at process._tickCallback (internal/process/next_tick.js:188:7) at Function.Module.runMain (module.js:695:11) at startup (bootstrap_node.js:191:16) at bootstrap_node.js:612:3
感谢 @sven。
test.c:
#include <emscripten/emscripten.h>
int EMSCRIPTEN_KEEPALIVE add(int a, int b) {
return a + b;
}
emcc test.c -O2 -s WASM=1 -s SIDE_MODULE=1 -o test.wasm
test.js:
const util = require('util');
const fs = require('fs');
var source = fs.readFileSync('./test.wasm');
const env = {
__memory_base: 0,
tableBase: 0,
memory: new WebAssembly.Memory({
initial: 256
}),
table: new WebAssembly.Table({
initial: 0,
element: 'anyfunc'
})
}
var typedArray = new Uint8Array(source);
WebAssembly.instantiate(typedArray, {
env: env
}).then(result => {
console.log(util.inspect(result, true, 0));
console.log(result.instance.exports._add(10, 9));
}).catch(e => {
// error caught
console.log(e);
});
LinkError: WebAssembly实例化:导入#0模块=“env”函数=“__memory_base”错误:全局导入必须是数字
。 - sven#include
int EMSCRIPTEN_KEEPALIVE add(int a, int b)
{
return a+b;
}
Node.js 应用程序:将memoryBase
替换为__memory_base
。 - sven