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