Ich lese ein tolles Buch über WebAssembly und versuche zu lernen, wie man JS-Funktionen importiert, ohne „Glue-Code“ zu verwenden wasm
.
Dies ist eine C-Datei, in der 2 extern
Funktionen deklariert sind
extern int jsClearRect(); extern int jsFillRect();
Ich habe dann den c
-Code mithilfe der folgenden Anweisungen in c
代码编译为 wasm
kompiliert:
emcc src/main.c -Os -s STANDALONE_WASM=1 -s SIDE_MODULE=1 -o main.wasm
Ich wurde dann angewiesen, ein JS-Skript zu schreiben, in dem 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))
Ich habe eine Fehlermeldung erhalten:
TypeError: import object field 'GOT.mem' is not an Object
Das importierte Objekt, das ich hier zeige, ist bereits eine modifizierte Version des Originalobjekts (das Sie hier finden können). In diesem Beispiel wird die Funktion in JS als _jsClearRect()
,但模块找不到 jsClearRect()
的定义。然后它找不到 __memory_base
的定义,因为它被声明为 memoryBase
但现在我不知道 Object
的国王代表 GOT.mem
deklariert.
Ich habe mich umgesehen und habe das Gefühl, dass ich eine alte API verwende, aber ich kann keine passende Lösung dafür finden.
Meine Frage lautet also:
Wie importiere ich Javascript-Funktionen in das Wasm-Modul?
GOT.mem
来自 emscripten 使用的动态链接 ABI。在这种情况下,我认为您不需要动态链接内容,您可以/应该删除-sSIDE_MODULE
。这应该简化/减少您需要提供的导入。 (例如,您不需要提供
table
或memory
)。