Übergeben Sie JS-Funktionen an WASM
P粉081360775
P粉081360775 2024-03-29 14:26:05
0
1
351

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 externFunktionen 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?

P粉081360775
P粉081360775

Antworte allen(1)
P粉276876663

GOT.mem​​ 来自 emscripten 使用的动态链接 ABI。在这种情况下,我认为您不需要动态链接内容,您可以/应该删除 -sSIDE_MODULE

这应该简化/减少您需要提供的导入。 (例如,您不需要提供 tablememory)。

Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage