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

How to return an array of unknown size in Enscripten?

本文关键字:数组 未知 返回 Enscripten      更新时间:2023-10-16

>我有一个 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);

这是没有效率的。另外,如果结果的大小很大并且没有足够的内存预分配怎么办?

对于您的特定情况,使用 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() 等方法。