Saya sedang membaca buku hebat tentang WebAssembly dan saya cuba belajar cara mengimport fungsi JS tanpa menggunakan "kod gam" wasm
.
Ini ialah fail C di mana 2 extern
fungsi diisytiharkan
extern int jsClearRect(); extern int jsFillRect();
Saya kemudian menyusun kod c
ke dalam c
代码编译为 wasm
menggunakan arahan berikut:
emcc src/main.c -Os -s STANDALONE_WASM=1 -s SIDE_MODULE=1 -o main.wasm
Saya kemudian diarahkan untuk menulis skrip JS di mana 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))
Saya mendapat ralat:
TypeError: import object field 'GOT.mem' is not an Object
Objek import yang saya tunjukkan di sini sudah pun versi diubah suai bagi objek asal (yang boleh anda temui di sini). Dalam contoh ini, fungsi diisytiharkan dalam JS sebagai _jsClearRect()
,但模块找不到 jsClearRect()
的定义。然后它找不到 __memory_base
的定义,因为它被声明为 memoryBase
但现在我不知道 Object
的国王代表 GOT.mem
.
Saya telah melihat sekeliling dan berasa seperti saya menggunakan API lama, tetapi saya tidak dapat mencari penyelesaian yang sesuai untuk mencapai perkara ini.
Jadi soalan saya ialah:
Bagaimana untuk mengimport fungsi Javascript ke dalam modul wasm?
GOT.mem
来自 emscripten 使用的动态链接 ABI。在这种情况下,我认为您不需要动态链接内容,您可以/应该删除-sSIDE_MODULE
.Ini seharusnya memudahkan/mengurangkan import yang perlu anda sediakan. (Sebagai contoh, anda tidak perlu menyediakan
table
或memory
).