例子1: 傳遞int數組給wasm數組
int* t; void EMSCRIPTEN_KEEPALIVE init(int* p) { t=p; return 1; }
調用init時,函數
let arrays = new Array(10).fill(0); let size = arrays.length; //ptr是偏移量, let ptr = Module._malloc(size * 4); let segment = new Int32Array(size); for (let i = 0; i < length1; i++) { segment[i] = arrays[i]; } //這裏要除以4, 由於 HEAP32是32位,因此 1偏移 = 4字節 Module.HEAP32.set(segment, ptr >> 2); //這裏就好了 Module._init(ptr)
例子2: wasm函數返回long數組code
long long* t; long long* EMSCRIPTEN_KEEPALIVE call() { return t; }
js端調用Module._call()後,返回的是數組t的地址,內存
let resultOffset = Module._call(); //根據偏移獲取內容 let memory = Module.HEAPU8.subarray(resultOffset, resultOffset) //嘗試了一下,直接用memory.buffer初始化DataView,會致使獲取不到數據,全部從新建立了一個Uint8Array保存結果 let resultLenth = 返回數組長度 let arrayBuffer = new Uint8Array(resultLenth); for (let i = 0; i < resultLenth; i++) { arrayBuffer[i] = memory[i]; } let dataView = new DataView(arrayBuffer.buffer, 0, resultLenth); let TopResult = new Array(返回數組長度); // 內存中數據是小端模式;i要間隔8,由於一個BigInt讀取8字節 for (let i = 0, index = 0; i < size; i += 8, index++) { TopResult[index] = dataView.getBigInt64(i, true) }