安卓端 webassembly.instantiate 异步一直卡住 不返回结果 WebAssembly.Module也会报错

安卓端 webassembly.instantiate 异步一直卡住 不返回结果 WebAssembly.Module也会报错

开发环境 版本号 项目创建方式
Windows 10 家庭中文版 HBuilderX

操作步骤:

如果我用 const mod = new WebAssembly.Module(wasmBuffer); 就会报错 CompileError: WebAssembly.Module(): return count of 2 exceeds internal limit of 1 但是我rust只写了一个函数 #[wasm_bindgen] pub fn greet(name: &str) -> String { format!(“Hello, {}!”, name) }

const importsaaa = {}; importsaaa.wbg = {}; importsaaa.wbg.__wbindgen_init_externref_table = function() { const table = wasm.__wbindgen_export_0; const offset = table.grow(4); table.set(0, undefined); table.set(offset + 0, undefined); table.set(offset + 1, null); table.set(offset + 2, true); table.set(offset + 3, false); ;

};

预期结果:

WebAssembly.instantiate 成功

实际结果:

WebAssembly.instantiate 不成功

bug描述:


4 回复

看着是 webassembly 的问题,缩小问题范围,web 是否正常,如果有问题优先处理 web 问题


h5正常 app不正常 为什么app端webassembly.instantiate不会走呢 明明有这个方法 能打印出来

一样遇到了这个问题,作者解决了么?这边也是在H5上能正常执行,在app端,走到webassembly.instantiate就卡住了.

这个问题的根本原因是WebAssembly在Android端的兼容性问题。以下是关键点分析:

  1. 关于WebAssembly.Module报错:
  • Android系统WebView对WASM的支持有限制
  • 错误信息表明系统限制了返回值的数量(1个),而你的Rust代码可能生成了多个返回值
  1. 关于instantiate卡住:
  • 这是Android WebView的已知问题
  • 建议改用WebAssembly.instantiateStreaming替代方案

解决方案:

  1. 改用异步加载方式:
const wasm = await WebAssembly.instantiateStreaming(
  fetch('your.wasm'),
  importsaaa
);
回到顶部