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数组

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)
}

你可能感兴趣的:(wasm与js,输入输出)