首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >node-ffi如何在回调后将结果转换为所需的结构?

node-ffi如何在回调后将结果转换为所需的结构?
EN

Stack Overflow用户
提问于 2019-01-15 10:50:23
回答 1查看 793关注 0票数 1

回调后尝试获取数据,自己没有了,还想把数据转换成你需要的结构怎么办呢?

C代码:

代码语言:javascript
复制
main.c
Ibox_Controller_SetSendReaderRequestAction(&sendReaderRequest);
Ibox_Result_ReaderInfo *readerInfoResult = Ibox_Controller_ReaderInfo();

hw.h 
Ibox_Result_ReaderInfo *Ibox_Controller_ReaderInfo();
void Ibox_Controller_SetSendReaderRequestAction(IboxSendReaderRequestAction action);
Ibox_MemoryStruct *sendReaderRequest(char *request, int length);

typedef struct {
    const char *errorMessage;
    const char *bootloaderVersion;
    const char *firmwareVersion;
    const char *hardwareVersion;
    int errorCode;
} Ibox_Result_ReaderInfo;

hw.c
char *sendData(char *buf, int size, uint16_t *retsize)
{   
    char *retbuf = 0;
    ....
    return retbuf;
}

Ibox_MemoryStruct *sendReaderRequest(char *request, int length)
{   
    uint16_t responseLength = 0;    
    char *responseData = sendData(request, length, &responseLength);    
    Ibox_MemoryStruct *response = malloc(sizeof(Ibox_MemoryStruct));    
    response->length = responseLength;  
    response->data = responseData;  
    return response;
}

首先,我们注册一个处理程序Ibox_Controller_SetSendReaderRequestActio,其他函数将使用这个处理程序,但问题是在回调之后我无法获得结果。

JS代码

代码语言:javascript
复制
var ffi = require('ffi');
var ref = require('ref');

var ArrayType = require('ref-array');
var StructType = require('ref-struct');
var lib = './libpay/libSDK.so';

var charPtrArray = ArrayType('char *', 64);
var charPtrArrayPtr = ref.refType(charPtrArray);

var voidPtr = ref.refType(ref.types.void);

var Ibox_Result_ReaderInfo = StructType({
    errorMessage : string,
    bootloaderVersion : string,
    firmwareVersion : string,
    hardwareVersion : string,
    errorCode : string
});

var Ibox_MemoryStruct = StructType({
      data : 'string',
    length : ref.types.int
});

var sendReaderRequest = ffi.Callback('void', [charPtrArrayPtr, 'int'],  
  function(request, size) {
    console.log(request, size);
    return 'action\n1'; //result 
  });

var ib = ffi.Library(lib, {
    "Ibox_Controller_SetSendReaderRequestAction" : ['void', ['pointer']],
    "Ibox_Controller_ReaderInfo" : ['void', []],
});

ib.Ibox_Controller_SetSendReaderRequestAction(sendReaderRequest);
var resReaderInfo = ib.Ibox_Controller_ReaderInfo(); //result null why?
EN

回答 1

Stack Overflow用户

发布于 2019-01-17 23:07:12

检查Ibox_Controller_ReaderInfo的ffi定义。我想这是

代码语言:javascript
复制
"Ibox_Controller_ReaderInfo" : ['void', []]

应该更像这样:

代码语言:javascript
复制
"Ibox_Controller_ReaderInfo" : ['void*', []]

甚至是

代码语言:javascript
复制
"Ibox_Controller_ReaderInfo" : ['pointer', []]

因为您要从Ibox_Controller_ReaderInfo()返回一个指针

编辑:多考虑一下,你可能需要一些类似的东西:

代码语言:javascript
复制
const Ibox_Result_ReaderInfo_Ptr = ref.refType(Ibox_Result_ReaderInfo);

var ib = ffi.Library(lib, {
    "Ibox_Controller_SetSendReaderRequestAction" : ['void', ['pointer']],
    "Ibox_Controller_ReaderInfo" : [Ibox_Result_ReaderInfo_Ptr, []],
});

因为你需要告诉ffi你的函数返回一个指针。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54192093

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档