Ошибка при интеграции кода узла js в библиотеку cpp

Я пытаюсь библиотеки node-ffi вызывать код cpp.

Код CPP

typedef struct{
    char * key,
    char * value
} ContextAttribute;

typedef struct{
    ContextAttribute * attribute,
    int count
} Context;

Это используется в

Status Init(     
    Handle* handle,       
    const char* id,    
    const char* token, 
    const char* apiKey,
    const char* productname,          
    const char* productVersion,        
    const char* productLanguage,       
    PlatformType platform,             
    const char* userGuid,              
    EventCb eventcb,
    Context * context
);

Я потребляю вышеуказанный код cpp следующим кодом javascript узла-ffi

var ref = require('ref');
var ffi = require('ffi');
var Struct = require('ref-struct');

var ContextAttribute = new Struct({
    key: "string",
    value: "string"
});

var Context = new Struct({
    attribute: ref.refType(ContextAttribute),
    count: "int"
});

'Init': [Status, [
        ref.refType(voidPtr),
        'string',
        'string',
        'string',
        'string',
        'string',
        'string',
        PlatformType,
        'string',
        EventCb,
        ref.refType(Context)
    ]],

Функция называется

this.Init(clientId, token, apiKey, productName, productVersion, productLanguage, platform, userGuid, Event, wrapAsNative(callback), Context)

Я пытаюсь проверить это, используя

var context = [{
    attribute: [{
         key: 'os',
         value: 'win'
    }],
    count: 0
}];

var result = Lib.Init("myClient", testToken, '4d84247c36bd4f63977853eb1e0cb5b7', "asfasd",'12','en_US', 'MAC', '[email protected]', 'SIGNIN', function(Handle, Event){
}, context);

Я получаю следующую ошибку:

TypeError: аргумент настройки ошибки 10 - writePointer: экземпляр буфера, ожидаемый как третий аргумент в TypeError (native) в Object.writePointer(/Users/..../node_modules/ref/lib/ref.js:742:11) в Object. set (/Users/.../node_modules/ffi/ref/lib/ref.js:484:13) в Object.alloc(/Users/.../node_modules/ffi/lib/ref.js:516:13) ) в Object.proxy [as Init] (/Users/.../node_modules/ffi/lib/_foreign_function.js:50:22) в Object.Lib.Init(/Users/.../src/Lib.js: 130: 26)

Ответ 1

var context = [{
    attribute: [{
         key: 'os',
         value: 'win'
    }],
    count: 0
}];

Это не то, как вы создаете действительный объект Buffer с компоновкой Context. Вы должны использовать var context = new Context; для создания правильно типизированного объекта.

Это то, что сообщает сообщение об ошибке - context не является допустимым Buffer.

Не уверен в этом, но я не думаю, что ref поддерживает массивы C-стиля, поэтому структура указателя + count не работает так. Если вы хотите использовать их, вам нужно будет сделать это на стороне C и обработать массив как непрозрачный тип указателя.

(Не на самом деле правда, это возможно. Но это требует возиться с параметром смещения на get и set методов исходного Buffer, например.)

Связанные списки действительно работают.