我手写了一些WebAssembly模块,以了解它们是如何工作的。现在我正在尝试了解导入和导出是如何工作的,以及如何执行IO。
该模块如下:
(module
(import "env" "print_string" (func $print_string (param i32)))
(func $main (result i32)
i32.const 1024
call $print_string
i32.const 0
)
(memory $memory 2)
(data (i32.const 1024) "example\00")
(export "memory" (memory $memory))
(export "main" (func $main))
)到目前为止,我一直在使用wasmtime (这是一个用Rust编写的WebAssembly应用程序接口)来运行这个模块。使用wasmtime,我可以实例化一个Linker,它将负责包装我传递给模块的来自主机的print_string函数。包装的print_string函数可以访问一个额外的Caller参数,它允许我检查实例化的模块导出,获取内存并从中读取以null结尾的字符串。这使我既可以导出内存,又可以在导入的函数中访问实例化模块的内存。
在WebAssembly的JavaScript应用程序接口中,这是可能的吗?我正在查看可用的here应用程序接口,但似乎没有任何东西表明这是可能的。
我在JavaScript应用程序接口中看到的唯一解决方案是:模块还从主机导入内存,而不是从模块导出内存。这样,导入的函数也可以访问内存对象。理想情况下,我希望模块导出自己的内存。
发布于 2021-09-01 07:09:35
至少在Javascript中你可以这样做
new Uint8Array(wasmInstance.exports.memory.buffer)访问导出为Byte Array的整个内存。例如,我使用它将内存的第一个字节导出到画布中
var wasmModule = new WebAssembly.Module(bytes);
var wasmInstance = new WebAssembly.Instance(wasmModule,{
gfx: {
flip: function() {
imageData.data.set(new Uint8Array(wasmInstance.exports.mem.buffer,0,canvasWidth*canvasHeight*4));
ctx.putImageData(imageData, 0, 0);
}
}
});
wasmInstance.exports.init();你可以在这里看到整个演示:http://worlddominationcommittee.org/~lee/filez/wasm/test5.html
https://stackoverflow.com/questions/69003106
复制相似问题