gpt4 book ai didi

c++ - 如何将 V8 对象转换为指针?

转载 作者:行者123 更新时间:2023-12-02 07:53:00 36 4
gpt4 key购买 nike

我正在编写一个 Node 应用程序(在 TS 中),需要与一些 native 库交互。

我有一个库(用 C 编写) - 让我们认为它是一个黑盒 - 我正在使用 NAN 编写一个包装器。库原生接口(interface)可以简化为以下函数:

typedef void (*got_message_reply_cb)(context ctx, void * priv, struct X * the_reply);

context lib_connect();
bool lib_send_message(context ctx, message msg, got_message_reply_cb callback, void * priv);

我相信这很容易理解。

所以,我试图将黑盒 native 库包装成类似的东西:

class TheLibrary : public Nan::ObjectWrap {
Initialize(v8::Handle<v8::Object> target);
SendMessage(...)
}

然后是 javascript 对象,例如:

class TheLibrary {
SendMessage(message: whatever, callback: (reply) => void); // or return promise, doesn't matter
}

如何在 NAN C++ 模块中实际处理回调?我需要以某种方式将回调(可能由 Local<Function> 表示 - 如果我理解正确的话,其范围有限)作为指向函数的指针传递,然后将其检索回来。怎么做?感谢您的回复。

最佳答案

高级答案是,您不直接传递 JS 回调函数,而是传递一个指向函数的指针,该函数以某种方式将 JS 回调作为上下文值(在您的示例中是 priv 参数)。

因此,对于您的情况,您可以写这样的内容:

void TheLibraryCallback(context ctx, void *instance, struct X *the_reply) {
((TheLibrary*)instance)->callback(ctx, the_reply);
}

在您的 TheLibrary 中,添加一个处理回调的方法 void callback(context ctx, struct X * the_reply) 。您可以这样调用您的库:lib_send_message(ctx, msg, TheLibraryCallback, this);,其中this是一个TheLibrary实例。

那么你的回调方法中如何回调JS回调呢?使用 nan 时,您必须确保回到主线程。有examples在那里,但我建议您使用新的 N-API反而。 AsyncWorker帮助您完成在主线程中调用回调所需的样板。

关于c++ - 如何将 V8 对象转换为指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53231876/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com