如何在Enscripten中返回未知大小的数组?

时间:2016-06-13 15:06:26

标签: javascript c++ c emscripten

我有一个C / C ++函数,它返回两个数组,每个数组的大小在调用之前是未知的。我需要从JavaScript调用此函数。 (为简单起见,在示例中返回一个数组)。

extern "C" {
  void produce_object_3d(float* verts, int *num_verts);
}

请注意,JavaScript不知道std::vectorboost:array以及其他类型。我目前预先分配一些空间,但它不起作用。这是JavaScript方面的代码:

var verts_address = Module._malloc(FLOAT_SIZE*3*max_verts);
var nv_address = Module._malloc(INT_SIZE*1);
//
produce_object_3d (verts_address, nv_address);
//
var nverts = Module.HEAPU32[nv_address/INT_SIZE];
var verts = Module.HEAPF32.subarray(verts_address/FLOAT_SIZE, verts_address/FLOAT_SIZE + 3*nverts);

效率不高。如果结果的大小很大并且没有预先分配足够的内存呢?

1 个答案:

答案 0 :(得分:0)

对于您的特定情况,使用embind是一个更好的选择。 根据官方文件

  

为方便起见,embind提供工厂功能进行注册   std :: vector(register_vector())和std :: map(register_map())   类型:

EMSCRIPTEN_BINDINGS(stl_wrappers) {
    register_vector<int>("VectorInt");
    register_map<int,int>("MapIntInt");
}

返回的对象具有.get()和.size()

等方法