詳解nodejs addon實(shí)現(xiàn)回調(diào)函數(shù)事件
封裝nodejs的addon接口,在處理回調(diào)函數(shù)這塊走了很多彎路,在此提供一個簡單的測試程序,有興趣的可以研究下。
安裝nan模塊
npm install nan
binding.gyp文件內(nèi)容如下:
{
'targets': [
{
"target_name": "bjcast_project_addon",
"sources": ["./bjcast_project_addon.cc"],
"include_dirs": [
"<!(node -e \"require('nan')\")",
],
}
]
}
bjcast_project_addon.cc內(nèi)容如下:
#include <iostream>
#include <string>
#include <v8.h>
#include <nan.h>
#include<windows.h>
using namespace v8;
struct OnStartSessionData {
Nan::Callback *callback; //回調(diào)函數(shù)
int reason; //需要回調(diào)到j(luò)s層的數(shù)據(jù)
uv_async_t handle; //異步句柄
};
OnStartSessionData *on_start_session_data = new OnStartSessionData();
static void OnBJCastStartSession(const int reason) {
on_start_session_data->reason = reason;
on_start_session_data->handle.data = (void *)on_start_session_data; //數(shù)據(jù)類型的一些轉(zhuǎn)換
uv_async_send(&on_start_session_data->handle); //喚醒事件循環(huán)中的事件
}
void OnStartSessionEvent(uv_async_t *handle) { //具體執(zhí)行的事件
Nan::HandleScope scope;
OnStartSessionData *data = (OnStartSessionData *)handle->data;
v8::Local<v8::Value> argv[1] = {Nan::New((int)data->reason)};//數(shù)據(jù)類型的一些轉(zhuǎn)換
data->callback->Call(1, argv); //數(shù)據(jù)回調(diào)到j(luò)s層
}
NAN_METHOD(bjcast_session) {
Local<String> ip_value = Local<String>::Cast(info[0]);
String::Utf8Value ip(ip_value);
std::string ip_str = std::string(*ip);
Local<Number> port_value = Local<Number>::Cast(info[1]);
double port = port_value->NumberValue();
Local<String> pin_value = Local<String>::Cast(info[2]);
String::Utf8Value pin(pin_value);
std::string pin_str = std::string(*pin);
Nan::Callback *start_session_callback = new Nan::Callback(info[3].As<Function>());
on_start_session_data->callback = start_session_callback; //獲取回調(diào)函數(shù)
uv_async_init(uv_default_loop(), &on_start_session_data->handle,OnStartSessionEvent); //加入事件循環(huán)中,等待喚醒,uv_default_loop()獲取libuv默認(rèn)創(chuàng)建的事件循環(huán)句柄
// int32_t value = BJCastProjectLib::GetInstance().StartBJCastSession(
// ip_str.c_str(), (uint16_t)port, pin_str.c_str(),start_session_callback);
int value = 0;
Local<Value> argv[1] = {Nan::New((int)value)};
info.GetReturnValue().Set(Nan::New((int)value));
OnBJCastStartSession(5);
}
NAN_MODULE_INIT(init) {
Nan::Export(target, "startBJCastSession", bjcast_session);
}
NODE_MODULE(bjcast_project_addon_win, init)
index.js的內(nèi)容如下:
var BJLib = require('./build/Release/bjcast_project_addon.node');
var serverIp = '192.168.9.155';
var serverPort = 8188;
var pin = '';
onStartSessionResult =function(result) {
console.log('result = ', result);
}
var ret_value = BJLib.startBJCastSession(
serverIp, serverPort, pin, onStartSessionResult);
console.log(ret_value);
運(yùn)行
node index.js 0 result = 5
到此這篇關(guān)于詳解nodejs addon實(shí)現(xiàn)回調(diào)函數(shù)事件的文章就介紹到這了,更多相關(guān)nodejs addon 回調(diào)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Windows部署NVM并下載多版本Node.js的方法(含刪除原有Node的方法)
這篇文章主要介紹了Windows部署NVM并下載多版本Node.js的方法(含刪除原有Node的方法),文中通過圖文結(jié)合的方式講解的非常詳細(xì),對大家了解Node.js有一定的幫助,需要的朋友可以參考下2025-01-01
node.js利用redis數(shù)據(jù)庫緩存數(shù)據(jù)的方法
Redis數(shù)據(jù)庫采用極簡的設(shè)計思想,最新版的源碼包還不到2Mb。其在使用上也有別于一般的數(shù)據(jù)庫。下面這篇文章就來給大家介紹了node.js利用redis數(shù)據(jù)庫緩存數(shù)據(jù)的方法,需要的朋友可以參考借鑒,下面來一起看看吧。2017-03-03
websocket+node.js實(shí)現(xiàn)實(shí)時聊天系統(tǒng)問題咨詢
最近新學(xué)習(xí)websocket,做了一個實(shí)時聊天。用Node.js搭建的服務(wù):serevr.js. 兩個相互通信頁面:client.html 和server.html 但是就是有很多問題,下面通過本文給大家分享下2017-05-05
node.js調(diào)用Chrome瀏覽器打開鏈接地址的方法
其實(shí)在Node.JS中打開瀏覽器網(wǎng)址非常簡單,但還是有必要整理下分享給有需要的朋友們,這篇文章主要給大家介紹了node.js如何調(diào)用Chrome瀏覽器打開鏈接地址的方法,文中介紹的非常詳細(xì),需要的朋友們下面隨著小編來一起看看吧。2017-05-05
從零開始學(xué)習(xí)Node.js系列教程之基于connect和express框架的多頁面實(shí)現(xiàn)數(shù)學(xué)運(yùn)算示例
這篇文章主要介紹了Node.js基于connect和express框架的多頁面實(shí)現(xiàn)數(shù)學(xué)運(yùn)算,簡單講述了connect和express框架的原理及數(shù)學(xué)運(yùn)算相關(guān)操作技巧,需要的朋友可以參考下2017-04-04

