Как вызвать метод в c ++ из node-ffi с вектором структур в качестве параметров? - PullRequest
0 голосов
/ 30 августа 2018

В настоящее время у нас есть старая библиотека c ++, которую мы хотим вызывать из узла, используя ffi по соображениям совместимости. Один из методов внутри библиотеки имеет следующее определение:

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 вместо вектора, тогда он работает безупречно. Как правильно выстроить вектор данных структур?

1 Ответ

0 голосов
/ 30 августа 2018

Вы не можете. std::vector определяется реализацией, и его внутренняя структура зависит от компилятора. На данный момент и, насколько мне известно, node-ffi не имеет типа, соответствующего std::vector.

Поскольку звучит так, как будто вы можете изменить сигнатуру метода, я бы рекомендовал изменить метод для принятия простого массива в стиле C, который совместим с node-ffi's ArrayType:

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