将JS数字数组传递给emscripten C ++而无需reinterpret_cast

时间:2015-07-14 09:55:45

标签: javascript c++ emscripten


我在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的一般限制,还是有一个不那么脏的&#34;解决方案比reinterpret_cast解决?

1 个答案:

答案 0 :(得分:0)

如果您

,可以使用void *
  • 指定该函数采用uintptr_t而不是EMSCRIPTEN_BINDINGS;

  • 不要使用EMSCRIPTEN_KEEPALIVE,而是使用cwrap + ccall / EMSCRIPTEN_BINDINGS方式来传达JS-&gt; C ++。由于某些原因,我尝试getTypeName is not defined方式会导致extern "C" int EMSCRIPTEN_KEEPALIVE myFunc(void *bufAddr, unsigned int size) { origFunc(static_cast<double *>(bufAddr), size); return 0; } 例外。

所以函数看起来像:

<uses-permission android:name="android.permission.GET_ACCOUNTS" />

可以通过

从Javascript调用
Module.ccall('myFunc', 'number' ['number', 'number'], [buf, size]);