wasm 源码

引入打印函数,引入线性内存,定义字符串"Hi",wasm 导出函数 writeHi,传递给打印函数内存内容,并进行打印。 这里的难点在 js 函数,可参考下面小程序中的源码。

(module
  (import "console" "log" (func $log (param i32 i32)))
  (import "js" "mem" (memory 1))
  (data (i32.const 0) "Hi")
  (func (export "writeHi")
    i32.const 0  ;; pass offset 0 to log
    i32.const 2  ;; pass length 2 to log
    call $log)
	)

小程序调用

定义全局变量 let inst;

将编码 js 文件下载,需要 lib 下面的两个文件(encoding.js,encoding-indexes.js),放入到小程序要引用的目录内。该 js 下载地址为 https://github.com/inexorabletash/text-encoding

引入编码 js, var encoding = require("encoding.js")

上面的编码 js 文件如果不引入,在真机上会出现错误,TypeError: TextDecoder is not a constructor。

定义加载 wasm 函数,并在 onload 中调用

  loadWasm(){
    var memory = new WXWebAssembly.Memory({
      initial: 1
    });
    var importObj = {
      console: {
        log: function consoleLogString(offset, length) {
          var bytes = new Uint8Array(memory.buffer, offset, length);
          var string = new encoding.TextDecoder('utf8').decode(bytes);
          wx.showToast({
            title: string,
          })
          console.log(string);
        },
      },
      js: {
        mem: memory
      }
    };
    WXWebAssembly.instantiate("/wasm/logstr.wasm", importObj).then(
      (result) => {
        console.log("初始化成功");
         inst = result.instance.exports;

      },
      (err) => {
        console.log("初始化失败", err);
      }
    );
  },

调用 wasm 的函数

callWasm() {
     inst.writeHi();
  },

这样就可以了,可以在小程序五位字节码查看效果,有任何问题,欢迎提问讨论。