Ошибка при интеграции кода узла 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
, например.)
Связанные списки действительно работают.