Heim  >  Fragen und Antworten  >  Hauptteil

Übergeben Sie JS-Funktionen an WASM

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粉081360775P粉081360775204 Tage vor294

Antworte allen(1)Ich werde antworten

  • P粉276876663

    P粉2768766632024-03-30 09:04:48

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

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

    Antwort
    0
  • StornierenAntwort