[英]Calling and wrapping C function in Nodejs (Emscripten)
我是 emscripten 和 Web 开发的新手。
最近,我正在尝试构建一个基于 C 库的 node.js 模块。 我正在测试一个简单的函数,比如int add(int a, int b)
。 我使用MODULARIZE
来编译 C 库,让它将模块作为包装的承诺函数而不是全局模块传递。
我可以使用ccall
方法在 javascript 中调用该函数,就像 emscripten 文档所说的那样。
factory().then(instance => {
instance.ccall('add', 'number', ['number', 'number'], [1, 1]);
});
但是我怎样才能以一种让我在不处理 Promises 的情况下调用函数的方式包装函数呢? 例如。
let sum = add(1, 2);
// sum = 3;
您可以创建一个独立的 wasm 二进制文件,然后使用WebAssembly.Instance
作为包装器。 首先创建一个没有main的c文件。
#include <emscripten/emscripten.h>
EMSCRIPTEN_KEEPALIVE int add(int a, int b)
{
return a + b;
}
注意:您必须在要导出的每个函数之前使用 EMSCRIPTEN_KEEPALIVE。 然后使用编译为独立的 wasm
$ emcc {Path to your c file } -o {The name of stand alone wasm} --no-entry
注意:您必须在文件名中写入扩展名。
例如$ emcc abc.c -o xyz.wasm --no-entry
应该生成一个单独的 xyz.wasm 而没有别的。
现在在你的 JS 文件中,你可以做
const readFileSync = require('fs').readFileSync;
const wasm_module = new WebAssembly.Instance(new
WebAssembly.Module(readFileSync(**{Path to the .wasm file you generated}**)));
然后所有或您导出的函数将在wasm_module.exports
可用,因此您可以执行类似的操作
const add = wasm_module.exports.add;
let sum = add(1, 2);
// sum = 3
现在 node 支持实验性 wasm 模块。 因此,您可以直接从.wasm文件中导入它,而不是那些长的 JS 代码,例如:
import * from '**{Path to .wasm file you generated}**' as wasm_module;
let sum = wasm_module.add(1, 2);
// sum = 3
注意:此功能是实验性的,因此您需要明确启用它。 即代替$ node script.js
,使用$ --experimental-wasm-modules script.js
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.