2
我想獲得WebAssembly緩衝區的內存地址並將其返回給Javascript,以便我可以將其內存作爲Javascript ArrayBuffer實例化,並直接在模塊內存中的適當地址寫入數組。如何找出WebAssembly緩衝區的地址並將其返回給Javascript?
C代碼:
#include <stdint.h>
uint8_t buff[10][100];
uint64_t addr(int buffer_index){
return (uint64_t)&buff[buffer_index];
}
我編譯:
emcc project.c -Os -s WASM=1 -s SIDE_MODULE=1 -o project.wasm
的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>
運行的結果:
project.html:21 5242880
project.html:22 5242980
project.html:23 5243080
看起來很理智,因爲緩衝區有100個字節塊,返回的地址相距100個字節。
如何找到這些地址指向模塊內存的位置?
感謝您的回答,它已經解決了我的問題。然而,不是內存,你必須看內存緩衝區,所以正確的行是:'var buffer = new Uint8Array(importObject.env.memory.buffer,exports._addr(0),100);'。我也喜歡Mandelbrot分形的項目。 – sbtpr
好點,我更新了代碼! – ColinE
'(exports._addr || exports.addr)(0)' - 下劃線僅由emcc添加,llvm按原樣導出名稱。 – Vitaly