我正在读一本关于 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 模块?