如何使用结构向量作为参数从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};
...
我们目前有一个旧的 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};
...