我如何检测 Emscripten 生成的 .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

它按预期工作并生成一个 .js 文件和一个 .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()

并获取 return 值。这是正确的,一切正常。

很明显,我也应该能够通过脚本来做到这一点。但是,我看不到在 我的 WebAssembly 实例化后仅 运行 一个函数 的方法。我觉得我错过了一些相当明显的东西。

无论如何,我该怎么做?

使用Module['onRuntimeInitialized'].

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

你用过emsdk,有Wasmfiddle之类的在线WASM编译器。发现 my github repo 对这两种方法都有用。

  <script>
    var Module = {
      onRuntimeInitialized: function() {
         console.log('module loaded');
      }
    };
  </script>

虽然 and 的两个解决方案完全没问题,但我想补充一点,您必须在 加载 WebAssembly 之前 执行此方法。否则可能来不及赶上活动。

除此之外,还有另一种方法,它使用承诺。如果您添加

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

作为使用 emcc 编译时的选项,您的结果 .js 将包含函数 createMyModule。一旦您的 WebAssembly 代码准备好使用,此函数将 return 一个 Promise 解析。用法示例:

在您的 HTML 中,像您一样添加您的 WebAssembly:

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

在你的 js 中,调用函数,在 promise 解决后,你就可以开始了:

createMyModule().then(MyModule => {
  console.log('WebAssembly loaded!');
  // Access your functions (if bound by Embind):
  console.log(MyModule.getSomething());
});