代码之家  ›  专栏  ›  技术社区  ›  Kilian Obermeier

如何加载。wasm文件存储在子目录中?

  •  8
  • Kilian Obermeier  · 技术社区  · 7 年前

    我正在尝试一个简单的例子来调用编译后的C函数。wasm与JavaScript。

    counter.c

    #include <emscripten.h>
    
    int counter = 100;
    
    EMSCRIPTEN_KEEPALIVE
    int count() {  
        counter += 1;
        return counter;
    }
    

    我用 emcc counter.c -s WASM=1 -o counter.js .

    main.js JavaScript文件:

    Module['onRuntimeInitialized'] = onRuntimeInitialized;
    const count = Module.cwrap('count ', 'number');
    
    function onRuntimeInitialized() {
        console.log(count());
    }
    

    index.html 文件仅加载两者。js文件在正文中,没有其他内容:

    <script type="text/javascript" src="counter.js"></script>
    <script type="text/javascript" src="main.js"></script>
    

    它工作正常/将101打印到控制台, 但是当我移动 文件到 wasm ,使用emscripten重新编译并更新 script src="wasm/counter.js" 这个 counter.js counter.wasm 从根目录而不是 wasm公司 子目录,我得到错误:

    counter.js:190 failed to asynchronously prepare wasm: failed to load wasm binary file at 'counter.wasm'

    2 回复  |  直到 7 年前
        1
  •  11
  •   HugoTeixeira    6 年前

    ColinE in the other answer ,您应该查看由emcc编译器(counter.js)生成的integrateWasmJS()函数。该函数的主体最近发生了变化,现在看起来是这样的:

    function integrateWasmJS() {
        ...
        var wasmBinaryFile = 'counter.wasm';
    
        if (typeof Module['locateFile'] === 'function') {
            ...
            if (!isDataURI(wasmBinaryFile)) {
              wasmBinaryFile = Module['locateFile'](wasmBinaryFile);
            }
            ...
        }
    }
    

    <script>
      var Module = {
        locateFile: function(s) {
          return 'wasm/' + s;
        }
      };
    </script> 
    
        2
  •  5
  •   ColinE    7 年前

    如果查看emscripten创建的生成的“加载程序”文件,它有一个 integrateWasmJS

    function integrateWasmJS(Module) {
      var method = Module['wasmJSMethod'] || 'native-wasm';
      Module['wasmJSMethod'] = method;
    
      var wasmTextFile = Module['wasmTextFile'] || 'hello.wast';
      var wasmBinaryFile = Module['wasmBinaryFile'] || 'hello.wasm';
      var asmjsCodeFile = Module['asmjsCodeFile'] || 'hello.temp.asm.js';
    
      ...
    }
    

    wasmBinaryFile 指示二进制文件的位置。如果未设置,则提供默认值。

    看起来你应该可以在你的 main.js

    Module['wasmBinaryFile'] = 'wasm/counter.wasm';