Je lis un excellent livre sur WebAssembly et j'essaie d'apprendre à importer des fonctions JS sans utiliser de "code de colle" wasm
.
Il s'agit d'un fichier C dans lequel 2 extern
fonctions sont déclarées
extern int jsClearRect(); extern int jsFillRect();
J'ai ensuite compilé le code c
dans c
代码编译为 wasm
en suivant les instructions suivantes :
emcc src/main.c -Os -s STANDALONE_WASM=1 -s SIDE_MODULE=1 -o main.wasm
On m'a ensuite demandé d'écrire un script JS où 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))
J'ai une erreur :
TypeError: import object field 'GOT.mem' is not an Object
L'objet importé que je montre ici est déjà une version modifiée de l'objet original (que vous pouvez trouver ici). Dans cet exemple, la fonction est déclarée en JS comme _jsClearRect()
,但模块找不到 jsClearRect()
的定义。然后它找不到 __memory_base
的定义,因为它被声明为 memoryBase
但现在我不知道 Object
的国王代表 GOT.mem
.
J'ai regardé autour de moi et j'ai l'impression d'utiliser une ancienne API mais je ne trouve pas de solution adaptée pour y parvenir.
Ma question est donc :
Comment importer des fonctions Javascript dans le module wasm ?
GOT.mem
来自 emscripten 使用的动态链接 ABI。在这种情况下,我认为您不需要动态链接内容,您可以/应该删除-sSIDE_MODULE
.Cela devrait simplifier/réduire les importations que vous devez fournir. (Par exemple, vous n'avez pas besoin de fournir
table
或memory
).