如何在Emscripten中不使用vector将JS数组作为C数组传入函数
Emscripten 实现JS数组直接传递给C普通数组的方案
C++侧代码
不需要额外引入vector逻辑,直接保留你需要的原生C数组函数逻辑即可,仅需添加导出标记:
#include <emscripten.h> EMSCRIPTEN_KEEPALIVE int add(const int test[], const int size) { int res = 0; for (int i = 0; i < size; i++) res += test[i]; return res; }
编译命令
编译时需要导出内存操作相关的依赖函数,示例编译指令:
emcc test.cpp -o test.js -s EXPORTED_FUNCTIONS=['_add','_malloc','_free'] -s EXPORTED_RUNTIME_METHODS=['ccall','cwrap']
JS侧调用实现
直接通过内存批量拷贝的方式传递数组,不需要逐个转存到vector,性能开销极低:
// 示例JS数组 const jsArray = [1, 2, 3, 4, 5]; // 转换为和C数组元素类型对应的TypedArray,int类型对应Int32Array const typedArray = new Int32Array(jsArray); // 分配对应大小的堆内存:数组长度 * 单个int的字节数(4) const ptr = Module._malloc(typedArray.length * typedArray.BYTES_PER_ELEMENT); // 批量将JS数组内容写入Emscripten堆内存 Module.HEAP32.set(typedArray, ptr / typedArray.BYTES_PER_ELEMENT); // 直接调用C函数,传入内存指针和数组长度 const result = Module._add(ptr, typedArray.length); console.log(result); // 输出运算结果15 // 手动释放分配的内存,避免内存泄漏 Module._free(ptr);
该方案直接在内存层面批量拷贝数据,省略了vector逐个插入元素的开销,性能接近原生C数组操作的效率,操作流程也更简洁。
注意事项
- 要保证TypedArray的类型和C数组的元素类型严格对应,比如C用short就用Int16Array,用unsigned int就用Uint32Array,避免类型错位导致数据错误
- 分配的内存用完必须手动释放,否则会出现内存泄漏
内容的提问来源于stack exchange,提问作者Ari
相关产品推荐
相关产品推荐

