大家
尝试编写动态库的第一个节点扩展(“/usr/local/lib/libkdriveExpress.so”)
此扩展程序应连接到设备并接收数据。在收到数据时,它应该从javascript回调函数。我已经找到了如何存储持久性函数,因此从cpp调用js函数不是问题。
在这个例子中,我使用简单的c ++函数,除了js
的问题///
void test(const uint8_t *telegram, uint32_t telegram_len, void *user_data){
kdrive_logger_ex(KDRIVE_LOGGER_ERROR, "kdrive: event callback");
};
void ap_open_ip(const FunctionCallbackInfo <Value> &args) {
/// ...
/// now register
kdrive_ap_register_telegram_callback(ap, &test, NULL, &key);
/// ...
}
当我从js调用它时它工作正常。
if (kdrive.ap_open_ip(ap, "192.168.3.201") == 0) {
console.log("great success", ap);
setTimeout(function () {
console.log(kdrive.whoami());
}, 2000)
}
但是当我从扩展程序调用任何函数时它不起作用。在上面的代码中,我调用whoami函数,它不使用动态库,只返回字符串。
这是日志:
great success 1
11:42:45:518 [kdrive.express] kdrive: event callback
11:42:45:590 [kdrive.express] kdrive: event callback
11:42:45:692 [kdrive.express] kdrive: event callback
11:42:45:735 [kdrive.express] kdrive: event callback
11:42:45:831 [kdrive.express] kdrive: event callback
11:42:45:900 [kdrive.express] kdrive: event callback
11:42:46:167 [kdrive.express] kdrive: event callback
11:42:46:717 [kdrive.express] kdrive: event callback
>>> whoami call
11:42:47:525 [kdrive.connector.ConnectorNotificationHandler] onSignal: System exception: cannot lock mutex
11:42:48:067 [kdrive.connector.ConnectorNotificationHandler] onSignal: System exception: cannot lock mutex
11:42:48:420 [kdrive.connector.ConnectorNotificationHandler] onSignal: System exception: cannot lock mutex
以下是kdrive_ap_register_telegram_callback函数的说明:
注册回调函数。
收到电报时将调用此回调函数 访问端口。内部使用通知线程,因此 回调将在通知线程的上下文中(而不是 主线程)。也就是说,在呼叫时应该小心 回调。此函数生成一个唯一键来表示 打回来。此密钥可用于稍后删除回调 状态。
所以,我猜问题是线程。 我是cpp扩展和cpp的新手,之前在js写过。所以,我想,我需要了解cpp中的线程如何工作以及v8引擎如何处理它。
非常感谢任何建议和建议。
答案 0 :(得分:0)
问题与线程无关。这是因为js gc破坏了kdrive对象。