我最近开始尝试将WebAssembly添加到我正在开发的应用程序中,但似乎遇到了一些麻烦。我一直得到两个错误中的一个:内存访问没有绑定或无法访问。我试图将长度为128的Float32Array发送到wasm模块,但它无法工作。下面是我使用的代码的一个示例:
zero.ts:
export function zero(arr: number[], length: number): number[] {
for (var i = 0; i < length; i++) {
arr[i] = 0;
}
return arr;
}
并使用以下终端命令进行编译:
asc zero.ts -o zero.wasm
然后在AudioWorkletNode中使用它,如下所示:
//wasmBytes is passed in form the main thread
var mod;
var importObject = {};
WebAssembly.instantiate(wasmBytes, importObject).then((instance) => {
mod = instance.instance.exports;
var f = new Float32Array(mod.memory.buffer, 0, arr.length);
f.set(arr);
var x = mod.zero(f.byteOffset, arr.length);
});
任何帮助都将不胜感激。
发布于 2022-07-15 06:45:37
WebAssembly只能通过js边界传递数字。这就是为什么像数组这样的运行时对象被管理的原因。每一种可以编译成WebAssembly的语言都有自己的结构&用于表示数组、字符串等的内存布局。编码和解码这些结构通常并不简单,所以有一些工具可以实现这一点。AssemblyScript,因为0.20.x版本也可以这样做。您需要两样东西--添加--exportRuntime和--bindings esm标志。您可以在文档中阅读更多有关它的内容:https://www.assemblyscript.org/compiler.html#host-bindings
https://stackoverflow.com/questions/72988159
复制相似问题