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

时间:2018-08-30 15:16:33

标签: c++ node-ffi

我们目前有一个旧的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]]
});

但是在调用此方法时,我总是遇到分段错误。我已经将node和c ++上的签名都更改为单个DataItem而不是vector,然后它可以正常工作。如何正确编组给定结构的向量?

1 个答案:

答案 0 :(得分:1)

不能。 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};
    ...