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,输入输出的主要内容,如果未能解决你的问题,请参考以下文章

除了HTMLCSS与JS,现在WASM也是标准Web语言

wasm-pack 代码中的 Rust 导入导致 JS 错误

如何在 Django 中提供 WASM 文件

emscripten 集成web常用编译命令

WebAssembly-wasm

片段(Java) | 机试题+算法思路+考点+代码解析 2023