将节点js代码集成到cpp库时出错

时间:2018-04-20 06:36:17

标签: c++ node.js node-ffi

我正在尝试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
);

我通过以下 node-ffi javascript代码消费上述cpp代码

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', 'abcd+1@pqr.com', 'SIGNIN', function(Handle, Event){
}, context);

我收到以下错误:

  

TypeError:错误设置参数10 - writePointer:缓冲区实例   预计作为第三个论点       在TypeError(本机)       at Object.writePointer(/Users/..../node_modules/ref/lib/ref.js:742:11)       at Object.set(/Users/.../node_modules/ffi/ref/lib/ref.js:484:13)       at Object.alloc(/Users/.../node_modules/ffi/lib/ref.js:516:13)       at Object.proxy [as Init](/Users /.../node_modules/ffi/lib/_foreign_function.js:50:22)       在Object.Lib.Init(/ Users /.../ src / Lib.js:130:26)

1 个答案:

答案 0 :(得分:0)

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

这不是您使用Buffer布局创建有效Context对象的方式。您必须使用var context = new Context;创建正确类型的对象。

这正是错误消息告诉您的内容 - context不是有效的Buffer

不确定,但我不认为ref支持C风格的数组,所以指针+ count结构不会那样工作。如果要使用它们,则必须在C端执行此操作,并将该数组视为不透明指针类型。

(实际上并非如此,有可能。但它需要在原始get实例的setBuffer方法上摆弄偏移量参数。)

链接列表可以正常工作。