将节点NAPI函数添加为对本机库的回调

问题描述 投票:0回答:1

是否可以将JavaScript函数作为回调添加到通过NAPI接受回调的本机库中?

这里是我到目前为止的示例附加代码。


Napi::Function *jsCallback;
void RegisterReadyEvent(const Napi::CallbackInfo &info)
{
    Napi::Function callback = info[0].As<Napi::Function>();
    jsCallback = &jsCallback;

    // native library function for registering callback
    callback_add(OnReadyCallback);
}

void OnReadyCallback(Args *arg)
{
   jsCallback->Call();
}

Napi::Object InitAll(Napi::Env env, Napi::Object exports)
{
    exports.Set(String::New(env, "onReady"), Function::New(env, RegisterReadyEvent));
    return exports;
}

问题是声明的顺序。似乎OnReadyCallback必须在RegisterReadyEvent函数之前声明,否则将无法编译。但是,如果我在RegisterReadyEvent之前声明它,则jsCallback变成一个空指针,并且仍然无法编译。

或者是否有更好且适当的方法来实现同一目标?

node.js callback function-pointers node-addon-api n-api
1个回答
0
投票

似乎C库具有void *data作为状态占位符。显然,这是C库中公开回调的规范。

通过Napi :: Function作为参考。

callback_add(OnReadyCallback, &callback);

然后将其退回。

void OnReadyCallback(Args *arg, void *data)
{
   ((Napi::Function *)data)->Call({});
}
© www.soinside.com 2019 - 2024. All rights reserved.