繁体   English   中英

在 Nodejs (Emscripten) 中调用和包装 C 函数

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM