繁体   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