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

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

本文关键字:向量 参数 方法 结构 node-ffi 调用 c++      更新时间:2023-10-16

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

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

数据项定义为:

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 而不是矢量,然后它完美运行。如何正确封送给定结构的向量?

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