安卓端 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描述:
看着是 webassembly 的问题,缩小问题范围,web 是否正常,如果有问题优先处理 web 问题
h5正常 app不正常 为什么app端webassembly.instantiate不会走呢 明明有这个方法 能打印出来
一样遇到了这个问题,作者解决了么?这边也是在H5上能正常执行,在app端,走到webassembly.instantiate就卡住了.
这个问题的根本原因是WebAssembly在Android端的兼容性问题。以下是关键点分析:
- 关于
WebAssembly.Module
报错:
- Android系统WebView对WASM的支持有限制
- 错误信息表明系统限制了返回值的数量(1个),而你的Rust代码可能生成了多个返回值
- 关于
instantiate
卡住:
- 这是Android WebView的已知问题
- 建议改用
WebAssembly.instantiateStreaming
替代方案
解决方案:
- 改用异步加载方式:
const wasm = await WebAssembly.instantiateStreaming(
fetch('your.wasm'),
importsaaa
);