首頁  >  問答  >  主體

將 JS 函數傳遞給 WASM

我正在閱讀一本關於 WebAssembly 的好書,我正在嘗試學習如何在不使用「膠水代碼」的情況下將 JS 函數導入 wasm

這是 C 文件,其中宣告了 2 個 extern 函數

extern int jsClearRect();
extern int jsFillRect();

然後,我使用以下說明將 c 程式碼編譯為 wasm

emcc src/main.c -Os -s STANDALONE_WASM=1 -s SIDE_MODULE=1  -o main.wasm

然後我被指示編寫一個JS腳本,其中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))

我收到一個錯誤:

TypeError: import object field 'GOT.mem' is not an Object

我在這裡展示的導入物件已經是原始物件的修改版本(您可以在此處找到)。在此範例中,函數在 JS 中宣告為 _jsClearRect(),但模組找不到 jsClearRect() 的定義。然後它找不到__memory_base 的定義,因為它被聲明為memoryBase 但現在我不知道Object 的國王代表GOT.mem

我環顧四周,感覺我正在使用舊的 API,但我找不到合適的解決方案來實現這一點。

所以我的問題是:

如何將 Javascript 函數匯入到 wasm 模組中?

P粉081360775P粉081360775204 天前296

全部回覆(1)我來回復

  • P粉276876663

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

    GOT.mem​​ 來自 emscripten 使用的動態連結 ABI。在這種情況下,我認為您不需要動態連結內容,您可以/應該刪除 -sSIDE_MODULE

    這應該會簡化/減少您需要提供的導入。 (例如,您不需要提供 tablememory)。

    回覆
    0
  • 取消回覆