[英]Passing JS number array to emscripten C++ without reinterpret_cast
我在JS中有大量数组,我想传递给C ++进行处理。 恕我直言,最有效的方法是让JS直接写入C ++堆并在直接调用中将指针作为参数传递,如:
var size = 4096,
BPE = Float64Array.BYTES_PER_ELEMENT,
buf = Module._malloc(size * BPE),
numbers = Module.HEAPF64.subarray(buf / BPE, buf / BPE + size),
i;
// Populate the array and process the numbers:
parseResult(result, numbers);
Module.myFunc(buf, size);
用于处理数字的C ++函数如下所示:
void origFunc(double *buf, unsigned int size) {
// process the data ...
}
void myFunc(uintptr_t bufAddr, unsigned int size) {
origFunc(reinterpret_cast<double*>(bufAddr), size);
}
这可以按预期工作,但我想知道是否有机会直接从Javascript调用origFunc
来摆脱myFunc
和丑陋的 reinterpret_cast
。
当我尝试通过以下方式绑定origFunc时:
EMSCRIPTEN_BINDINGS(test) {
function("origFunc", &origFunc, emscripten::allow_raw_pointers());
}
...并直接调用它:
Module.origFunc(buf, size);
我收到错误:
Uncaught UnboundTypeError:由于未绑定类型,无法调用origFunc:Pd
这是emscripten的一般限制,还是比reinterpret_cast
解决方案有“不太脏”的解决方案?
如果你可以使用static_cast
指定该函数采用void *
而不是uintptr_t
;
不要使用EMSCRIPTEN_BINDINGS
,而是使用EMSCRIPTEN_KEEPALIVE
+ cwrap
/ ccall
方式来传达JS-> C ++。 出于某种原因,当我尝试使用时, EMSCRIPTEN_BINDINGS
方式导致getTypeName is not defined
异常。
所以函数看起来像:
extern "C" int EMSCRIPTEN_KEEPALIVE myFunc(void *bufAddr, unsigned int size) {
origFunc(static_cast<double *>(bufAddr), size);
return 0;
}
可以通过Javascript调用
Module.ccall('myFunc', 'number' ['number', 'number'], [buf, size]);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.