如何使用结构向量作为参数从node-ffi调用c ++中的方法?

How to call a method in c++ from node-ffi with a vector of structs as parameters?

我们目前有一个旧的 c++ 库,出于兼容性原因,我们想使用 ffi 从节点调用它。 lib 中的一种方法具有以下定义:

int CalculateValue(std::vector<DataItem> dataItems, int mode)

DataItem 定义为:

struct DataItem
{
   const void *Data;
   int Size;
}

我已经用 ref-Array 尝试了一些变体(这显然不是正确的工具)

const InputDataStruct = StructType({
  Data: ref.refType(ref.types.void),
  Size: ref.types.int32
});

const InputVectorType = ArrayType(InputDataStruct);

const calculator = ffi.Library(libPath, {
  'CalculateValue': [ref.types.int32, [InputVectorType, ref.types.int32]]
});

但是我在调​​用这个方法时总是遇到分段错误。我已经将节点和 c++ 上的签名更改为单个 DataItem 而不是 vector,然后它可以完美地工作。我怎样才能正确编组给定结构的向量?

你不能。 std::vector 是实现定义的,它的内部结构取决于编译器。到目前为止,据我所知 node-ffi 没有对应于 std::vector.

的类型

既然听起来你可以更改方法签名,我建议更改方法以接受一个简单的 C 样式数组,它与 node-ffi 的 兼容ArrayType:

int CalculateValue(DataItem *dataItemsRawArray, int dataItemsCount, int mode)
{
    std::vector<DataItem> dataItems{dataItemsRawArray, dataItemsRawArray + dataItemsCount};
    ...