wasm与js,输入输出
Posted gg22g2
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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,输入输出的主要内容,如果未能解决你的问题,请参考以下文章