wasm與js,輸入輸出

例子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)
}
相關文章
相關標籤/搜索