为什么我的Wasm函数无法接收JavaScript对象参数?
我在用WebAssembly导入C函数时遇到了问题。导出的函数需要接收一个包含x/y坐标的对象参数,但调用时总报错说类型不匹配。
尝试过把对象转成JSON字符串再传入,但Wasm端解析时字符串长度超过预期导致溢出。现在直接传数字参数又感觉代码耦合太严重,有没有更好的方法处理复杂参数?
导出的C函数定义是这样的:
extern void process_point(double x, double y);
在JS里这样调用会报错:
const point = {x: 100, y: 200};
Module.process_point(point); // Uncaught TypeError: expected number, got object
更好的写法是利用Wasm的线性内存来传递复杂数据。具体来说,可以在Wasm模块中分配一块内存,用来存储你的对象数据,然后把这块内存的指针传给Wasm函数。下面是一个可行的实现方式:
首先在C代码里调整一下函数定义,改成接收指针的形式:
然后在JavaScript端,可以用Wasm模块提供的内存操作工具来写入对象数据:
调用的时候可以这样写:
这样做的好处是避免了手动序列化和解析字符串的麻烦,同时性能也更高。不过要注意的是,Wasm的内存管理需要你自己小心处理,别忘了清理或者复用内存,否则可能会导致内存泄漏。
如果你觉得每次手动写这些调用太啰嗦,可以封装成一个通用的工具函数,专门用来处理类似的需求。这种写法不仅优雅,还能减少重复代码,维护起来也方便多了。
C那边改成接收double*,别用两个单独的double参数。