将 JS 函数传递给 WASM

问题描述 投票:0回答:0

我正在读一本关于 WebAssembly 的好书,我正在尝试学习如何在不使用“胶水代码”的情况下将 JS 函数导入

wasm

所以 这是 C 文件,其中声明了 2

extern
函数

extern int jsClearRect();
extern int jsFillRect();

然后我使用以下指令将

c
代码编译成
wasm

emcc src/main.c -Os -s STANDALONE_WASM=1 -s SIDE_MODULE=1  -o main.wasm

然后我被指示编写一个 JS 脚本,其中

instantiate
wasm 文件,定义
jsFillRect()
jsClearRect()
并使用导入对象将它们导入到模块的
env
中。

// define the import Objects
const importObj = {
    "env": {
        "__memory_base":0,
        "tableBase":0,
        "memory": new WebAssembly.Memory({ initial: 256 }),
        "table": new WebAssembly.Table({ initial: 8, element: 'anyfunc' }),
        jsClearRect(): function() {/*function definition here*/},
        jsFillRect(): function() {/*function definition here*/},
    }
}
// import the module
fetch('main.wasm')
        .then(obj => WebAssembly.instantiateStreaming(obj,importObject))
        .then(result => console.log(result))
        .catch(err => console.log(err))

我得到一个错误:

TypeError: import object field 'GOT.mem' is not an Object

我在这里展示的导入对象已经是原始对象的修改版本(您可以在这里找到)。在此示例中,函数在 JS 中声明为

_jsClearRect()
,但模块找不到
jsClearRect()
的定义。然后它找不到
__memory_base
的定义,因为它被声明为
memoryBase
但现在我不知道
Object
的哪个国王代表
GOT.mem

我一直在四处寻找,我的感觉是我正在使用一个旧的 API,但我找不到合适的解决方案来实现这一点。

所以我的问题是:

如何将 Javascript 函数导入 wasm 模块?

javascript webassembly emcc
© www.soinside.com 2019 - 2024. All rights reserved.