【发布时间】:2018-03-26 16:35:25
【问题描述】:
我正在编写一个小型 C 程序,旨在通过 emcc 编译为 wasm 并在 Web 浏览器中运行。因为 wasm 导出的函数只能接受简单的数值作为参数输入和返回值,所以我需要在 JavaScript API 和编译的 WebAssembly 代码之间共享内存,以便访问更复杂的数据类型,如字符串或 char 数组。问题是我一辈子都不知道如何从我的 C 程序内部访问WebAssembly linear memory。
我的最终目标是能够在我的 C 程序中读取在 JavaScript 中初始化的字符串,然后还可以在 Web 浏览器的 JavaScript 代码中读取在我的 C 程序中修改/初始化的字符串。
这是我正在尝试做的一个基本示例:
main.js
const importObject = {
'env': {
'memoryBase': 0,
'tableBase': 0,
'memory': new WebAssembly.Memory({initial: 256}),
'table': new WebAssembly.Table({initial: 0, element: 'anyfunc'})
}
}
// using the fetchAndInstantiate util function from
// https://github.com/mdn/webassembly-examples/blob/master/wasm-utils.js
fetchAndInstantiate('example.wasm', importObject).then(instance => {
// call the compiled webassembly main function
instance.exports._main()
console.log(importObject.env.memory)
})
example.c
int main() {
// somehow access importObject.env.memory
// so that I can write a string to it
return 0;
}
This question 让我了解了其中的一部分,但是,我仍然不明白如何在我的 C 代码中从 WebAssembly 内存缓冲区读取/写入。
【问题讨论】: