簡體   English   中英

如何檢測 Emscripten 的 generated.js 何時完成加載 wasm,以便我可以運行調用它的 JS 函數?

[英]How do I detect when Emscripten's generated .js finishes loading the wasm so I can run my JS functions which call it?

我正在使用 Emscripten 將一些 C 代碼編譯為 WebAssembly。 這是我的 Makefile 中的最后一個 emcc 調用:

emcc $(CFLAGS) iva.a -o iva.js

它按預期工作並生成 a.js 文件和 a.wasm 文件。 JS 被加載到我的 HTML 頁面中,如下所示:

<script src="../dist/iva.js">

它會正確加載和實例化 WebAssembly 代碼iva.wasm 加載頁面后,此消息很快出現在控制台中:

Fetch finished loading: GET "http://localhost:6931/dist/iva.wasm".

我的意思是我的 WebAssembly 是通過 fetch() 加載的,並且可能正在等待一些處理,我可以通過控制台訪問我的函數:

Module._init_display_system()

並獲取返回值。 這是真的,一切正常。

顯然,我也應該能夠通過腳本來做到這一點。 但是,在實例化 WebAssembly之后,我看不到只運行 function 的方法。 我覺得我錯過了一些相當明顯的東西。

無論如何,我該怎么做?

使用Module['onRuntimeInitialized']

Module['onRuntimeInitialized'] = function() {
       console.log("wasm loaded ");
       var x=Module.ccall("doubleIt","number",["number"],[20]);
       alert(x);
    }

你用過 emsdk,有在線的 WASM 編譯器,比如 Wasmfiddle。 找到我的 github repo對這兩種方法都有用。

雖然Sudhakar RSAnil8753的兩種解決方案都很好,但我想補充一點,您必須在加載 WebAssembly之前執行此方法。 否則,趕上事件可能為時已晚。

除此之外,還有另一種使用 Promise 的方法。 如果你添加

-s MODULARIZE=1 -s 'EXPORT_NAME="createMyModule"'

作為使用emcc編譯時的選項,生成的.js將包含 function createMyModule 這個 function 將返回一個Promise ,它會在您的 WebAssembly 代碼准備好使用時立即解析。 示例用法:

在你的 HTML 中,像你已經做的那樣添加你的 WebAssembly:

<script src="../dist/iva.js">

在您的 js 中,調用 function 並在 promise 解決后,您對 go 很好:

createMyModule().then(MyModule => {
  console.log('WebAssembly loaded!');
  // Access your functions (if bound by Embind):
  console.log(MyModule.getSomething());
});
  <script>
    var Module = {
      onRuntimeInitialized: function() {
         console.log('module loaded');
      }
    };
  </script>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM