如何找到WebAssembly缓冲区的地址并将其返回到Javascript?
我试图获取WebAssembly缓冲区的内存地址并将其返回到Javascript,这样我就可以将其内存实例化为Javascript ArrayBuffer,并直接将其写入模块内存中适当地址的数组中 c代码:如何找到WebAssembly缓冲区的地址并将其返回到Javascript?,javascript,memory-address,webassembly,Javascript,Memory Address,Webassembly,我试图获取WebAssembly缓冲区的内存地址并将其返回到Javascript,这样我就可以将其内存实例化为Javascript ArrayBuffer,并直接将其写入模块内存中适当地址的数组中 c代码: #include <stdint.h> uint8_t buff[10][100]; uint64_t addr(int buffer_index){ return (uint64_t)&buff[buffer_index]; } html: <scr
#include <stdint.h>
uint8_t buff[10][100];
uint64_t addr(int buffer_index){
return (uint64_t)&buff[buffer_index];
}
html:
<script>
var importObject = {
env: {
memoryBase: 0,
tableBase: 0,
setTempRet0:(x)=>{},
memory: new WebAssembly.Memory({ initial:256 }),
table: new WebAssembly.Table({ initial:0, element:'anyfunc' })
}
};
fetch('http://localhost:9000/assets/wasm/project.wasm').then(
response => response.arrayBuffer()
).then(
bytes => WebAssembly.instantiate(bytes, importObject)
).then(
results => {
let module=results.instance
let exports=module.exports
let addr=exports._addr
console.log(addr(0))
console.log(addr(1))
console.log(addr(2))
}
)
</script>
这看起来很正常,因为缓冲区有100字节的块,返回的地址相隔100字节
如何找出这些地址在模块内存中的位置?您已经通过
importObject.env.memory
为模块提供了内存。您只需使用提供的偏移量/地址来检查分配给C代码中buff
变量的内存:
// create a Uint8Array as a 'view' on the module linear memory
// starting at _addr(0), and with a length of 100 elements.
var buffer = new Uint8Array(importObject.env.memory.buffer, exports._addr(0), 100);
for (var i=0; i<buffer.length; i++) {
var foo = buffer[i];
// do something with foo here!
}
//在模块线性内存上创建一个UINT8数组作为“视图”
//从_addr(0)开始,长度为100个元素。
var buffer=新的Uint8Array(importObject.env.memory.buffer,exports.\u addr(0),100);
对于(var i=0;iThanks for this response,它解决了我的问题。但是,您必须查看内存缓冲区,而不是内存,因此正确的行是:var buffer=new Uint8Array(importObject.env.memory.buffer,exports.\u addr(0),100);
。我也喜欢您的带有Mandelbrot分形的项目。(exports.| addr | exports.addr)(0)
-下划线仅由emcc添加,llvm按原样导出名称。
project.html:21 5242880
project.html:22 5242980
project.html:23 5243080
// create a Uint8Array as a 'view' on the module linear memory
// starting at _addr(0), and with a length of 100 elements.
var buffer = new Uint8Array(importObject.env.memory.buffer, exports._addr(0), 100);
for (var i=0; i<buffer.length; i++) {
var foo = buffer[i];
// do something with foo here!
}