N-API整理

一, 函數(shù)管理

提供了一組方法摊溶,來實(shí)現(xiàn)C++方法被調(diào)用 和 去調(diào)用js方法的功能

1.調(diào)用JavaScript方法

/**
* @param env 環(huán)境上下文
* @param jsthis 傳遞給被調(diào)用函數(shù)的this類型,普通調(diào)用瘾婿,默認(rèn)使用的全局window對(duì)象
* @param func 要調(diào)用的方法對(duì)象
* @param argc 傳遞給被調(diào)用方法的參數(shù)數(shù)量
* @param argv 傳遞的參數(shù)列表,是一個(gè)napi_value 的數(shù)組形式  
* @param result 被喚起的方法,的返回結(jié)果
* @return 返回napi_status 來判斷該方法是否執(zhí)行成功
**/
napi_status napi_call_function(napi_env env,
                               napi_value recv,
                               napi_value func,
                               int argc,
                               const napi_value* argv,
                               napi_value* result)

example

//全局對(duì)象下存在該方法
// function AddTwo(num) {
//    return  num + 2;
// }

//在全局對(duì)象下獲取AddTwo方法
napi_value global, add_two, arg;

//獲取全局對(duì)象
napi_status status = napi_get_global;
assert(status == napi_ok);

//使用全局對(duì)象獲取函數(shù)方法
status = napi_get_named_property(env, global, "AddTwo", &add_two);
assert(status == napi_ok);

//創(chuàng)建參數(shù)
status = napi_create_int32(env, 1200, &arg);
assert(status == napi_ok);

napi_value* argv = &arg;
size_t argc = 1;

//創(chuàng)建return_value 存儲(chǔ)返回的數(shù)據(jù)類型
napi_value return_val;

//調(diào)用方法
status = napi_call_function(env, global, add_two, argc, argv, &return_val);
assert(status == napi_ok);

//獲取執(zhí)行結(jié)果
int32_t = result;
status = napi_get_value_int32(env, return_val, &result);
assert(status == napi_ok);

2.創(chuàng)建JavaScript方法

該函數(shù)創(chuàng)建一個(gè)共給JavaScript調(diào)用的方法稍坯, 創(chuàng)建之后俊鱼,該方法必須通過掛載一個(gè)對(duì)象暴露出去

/**
* @param env 環(huán)境上下文
* @param uft8name 創(chuàng)建的方法名
* @param length 方法名的長度,可以使用NAPI_AUTO_LENGTH 來自動(dòng)處理
* @param cb 綁定的C++方法
* @param data  用戶提供的數(shù)據(jù)上下文
* @param result 執(zhí)行結(jié)果
* @return 返回napi_status 來判斷該方法是否執(zhí)行成功
**/
napi_status napi_create_function(napi_env env,
                                 const char* utf8name,
                                 size_t length,
                                 napi_callback cb,
                                 void* data,
                                 napi_value* result);

example

//const myaddon = require('./addon');
//myaddon.sayHello();

napi_value SayHello(napi_env env, napi_callback_info info) {
  printf("Hello\n");
  return NULL;
}

napi_value Init(napi_env env, napi_value exports) {
  napi_status status;
  napi_value fn;
  
  //創(chuàng)建一個(gè)方法
  status = napi_create_function(env, NULL, 0, SayHello, NULL, &fn);
  if (status != napi_ok) return NULL;
  
  //掛載到exports上锹安,對(duì)外暴露
  status = napi_set_named_property(env, exports, "sayHello", fn);
  if (status != napi_ok) return NULL;

  return exports;
}

NAPI_MODULE(NODE_GYP_MODULE_NAME, Init)

napi_get_cb_info

獲取JavaScript傳遞的參數(shù)

/**
* @param env 環(huán)境上下文
* @param cbinfo 函數(shù)信息
* @param argc 參數(shù)長度
* @param argv 參數(shù)內(nèi)容短荐,以napi_value 數(shù)組形式
* @param thisArg 接收J(rèn)avaScript 中的this 參數(shù)
* @param data 接收一個(gè)回調(diào)的數(shù)據(jù)指針
* @return 返回執(zhí)行結(jié)果
**/
napi_status napi_get_cb_info(napi_env env,
                             napi_callback_info cbinfo,
                             size_t* argc,
                             napi_value* argv,
                             napi_value* thisArg,
                             void** data)

napi_get_new_target

當(dāng)使用new 關(guān)鍵字創(chuàng)建對(duì)象時(shí),返回一個(gè) 實(shí)例的對(duì)象叹哭, 其他情況返回一個(gè)NULL

/**
* @param env 環(huán)境上下文
* @parma cbinfo 函數(shù)信息
* @param result 創(chuàng)建結(jié)果
* @return 返回執(zhí)行結(jié)果
**/
napi_status napi_get_new_target(napi_env env,
                                napi_callback_info cbinfo,
                                napi_value* result)

napi_new_instance

通過一個(gè)給定的napi_value值, 創(chuàng)建一個(gè)新的JavaScript實(shí)例忍宋。

//function MyObject(param) {
//  this.param = param;
//}

//const arg = 'hello';
//const value = new MyObject(arg);

// Get the constructor function MyObject
napi_value global, constructor, arg, value;

//獲取全局對(duì)象
napi_status status = napi_get_global(env, &global);
if (status != napi_ok) return;

//獲取JavaScript對(duì)象的引用
status = napi_get_named_property(env, global, "MyObject", &constructor);
if (status != napi_ok) return;

// const arg = "hello" 創(chuàng)建字符參數(shù)
status = napi_create_string_utf8(env, "hello", NAPI_AUTO_LENGTH, &arg);
if (status != napi_ok) return;

napi_value* argv = &arg;
size_t argc = 1;

// const value = new MyObject(arg) 使用一個(gè)引用,創(chuàng)建一個(gè)實(shí)例
status = napi_new_instance(env, constructor, argc, argv, &value);

二, 生命周期

1. 生命周期短于原生方法

napi_open_handle_scope

創(chuàng)建一個(gè)新的作用域

/**
* @param env 環(huán)境上下文
* @param scope 作用域變量 
* @return 返回執(zhí)行結(jié)果
**/
NAPI_EXTERN napi_status napi_open_handle_scope(napi_env env,
                                               napi_handle_scope* result);
napi_close_handle_scope

關(guān)閉一個(gè)作用域

/**
* @param env 環(huán)境上下文
* @param scope 作用域變量
* @return 返回執(zhí)行結(jié)果
**/
NAPI_EXTERN napi_status napi_open_handle_scope(napi_env env,
                                               napi_handle_scope* result);
napi_open_escapable_handle_scope

創(chuàng)建可逃逸的作用域

/**
* @param env 環(huán)境上下文
* @param scope 作用域
* @return 返回執(zhí)行結(jié)果
**/
NAPI_EXTERN napi_status
    napi_open_escapable_handle_scope(napi_env env,
                                     napi_handle_scope* result);
napi_close_escapable_handle_scope

關(guān)閉可逃逸的作用域

/**
* @param env 環(huán)境上下文
* @param scope 作用域
* @return 返回執(zhí)行結(jié)果
**/
NAPI_EXTERN napi_status
    napi_close_escapable_handle_scope(napi_env env,
                                      napi_handle_scope scope);
napi_escape_handle

逃脫作用方法

/**
* @param env 環(huán)境上下文
* @param scope 作用域
* @param escape 要逃脫的對(duì)象
* @param result 輸出逃脫對(duì)象的指針
* @return 返回執(zhí)行結(jié)果
**/
napi_status napi_escape_handle(napi_env env,
                               napi_escapable_handle_scope scope,
                               napi_value escapee,
                               napi_value* result);

2. 生命周期長與原生方法

napi_create_reference

創(chuàng)建引用

/**
* @param env 環(huán)境上下文
* @param value 需要?jiǎng)?chuàng)建引用的對(duì)象
* @param initial_refcount 初始化計(jì)數(shù)器
* @param result 綁定的引用變量
* @return 返回執(zhí)行結(jié)果
**/
NAPI_EXTERN napi_status napi_create_reference(napi_env env,
                                              napi_value value,
                                              int initial_refcount,
                                              napi_ref* result);
napi_delete_reference

刪除引用

/**
* @param env 環(huán)境變量
* @param  ref 引用
* @return 返回執(zhí)行結(jié)果
**/
NAPI_EXTERN napi_status napi_delete_reference(napi_env env, napi_ref ref);
napi_reference_ref

遞增計(jì)數(shù)值(+1)话速,并獲取

/**
* @param env 環(huán)境上下文
* @param ref 引用變量
* @param result 計(jì)數(shù)值
* @return 返回執(zhí)行結(jié)果
**/
NAPI_EXTERN napi_status napi_reference_ref(napi_env env,
                                           napi_ref ref,
                                           int* result);
napi_reference_unref

減少計(jì)數(shù)值(-1), 并獲取

/**
* @param env 環(huán)境上下文
* @param 引用變量
* @param result 計(jì)數(shù)值
* @return 返回執(zhí)行結(jié)果
**/
NAPI_EXTERN napi_status napi_reference_unref(napi_env env,
                                             napi_ref ref,
                                             int* result);
napi_get_reference_value

只是獲取計(jì)數(shù)值

/**
* @param env 環(huán)境上下文
* @param ref 引用變量
* @param result 計(jì)數(shù)值
* @return 返回執(zhí)行結(jié)果
**/
NAPI_EXTERN napi_status napi_get_reference_value(napi_env env,
                                                 napi_ref ref,
                                                 napi_value* result);

3. 退出與清理實(shí)例

napi_add_env_cleanup_hook

在引用退出時(shí)讶踪,使用指定的參數(shù)arg調(diào)用函數(shù)func, 不同的arg 和相同的func 可以被注冊(cè)多次,但是相同的arg 和 func 不能被注冊(cè)多次

/**
* @param env 環(huán)境上下文
* @param fun 注冊(cè)的函數(shù)指針
* @param arg 參數(shù)指針
* @return 返回執(zhí)行結(jié)果
**/
NAPI_EXTERN napi_status napi_remove_env_cleanup_hook(napi_env env,
                                                     void (*fun)(void* arg),
                                                     void* arg);
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末泊交,一起剝皮案震驚了整個(gè)濱河市乳讥,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌廓俭,老刑警劉巖云石,帶你破解...
    沈念sama閱讀 222,590評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異研乒,居然都是意外死亡汹忠,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,157評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門雹熬,熙熙樓的掌柜王于貴愁眉苦臉地迎上來宽菜,“玉大人,你說我怎么就攤上這事竿报∏ο纾” “怎么了?”我有些...
    開封第一講書人閱讀 169,301評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵烈菌,是天一觀的道長阵幸。 經(jīng)常有香客問我花履,道長,這世上最難降的妖魔是什么挚赊? 我笑而不...
    開封第一講書人閱讀 60,078評(píng)論 1 300
  • 正文 為了忘掉前任诡壁,我火速辦了婚禮,結(jié)果婚禮上荠割,老公的妹妹穿的比我還像新娘妹卿。我一直安慰自己,他們只是感情好涨共,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,082評(píng)論 6 398
  • 文/花漫 我一把揭開白布纽帖。 她就那樣靜靜地躺著,像睡著了一般举反。 火紅的嫁衣襯著肌膚如雪懊直。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,682評(píng)論 1 312
  • 那天火鼻,我揣著相機(jī)與錄音室囊,去河邊找鬼。 笑死魁索,一個(gè)胖子當(dāng)著我的面吹牛融撞,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播粗蔚,決...
    沈念sama閱讀 41,155評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼尝偎,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼!你這毒婦竟也來了鹏控?” 一聲冷哼從身側(cè)響起致扯,我...
    開封第一講書人閱讀 40,098評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎当辐,沒想到半個(gè)月后抖僵,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,638評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡缘揪,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,701評(píng)論 3 342
  • 正文 我和宋清朗相戀三年耍群,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片找筝。...
    茶點(diǎn)故事閱讀 40,852評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蹈垢,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出袖裕,到底是詐尸還是另有隱情曹抬,我是刑警寧澤,帶...
    沈念sama閱讀 36,520評(píng)論 5 351
  • 正文 年R本政府宣布陆赋,位于F島的核電站沐祷,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏攒岛。R本人自食惡果不足惜赖临,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,181評(píng)論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望灾锯。 院中可真熱鬧兢榨,春花似錦、人聲如沸顺饮。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,674評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽兼雄。三九已至吟逝,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間赦肋,已是汗流浹背块攒。 一陣腳步聲響...
    開封第一講書人閱讀 33,788評(píng)論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留佃乘,地道東北人囱井。 一個(gè)月前我還...
    沈念sama閱讀 49,279評(píng)論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像趣避,于是被迫代替她去往敵國和親庞呕。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,851評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容

  • Lua 5.1 參考手冊(cè) by Roberto Ierusalimschy, Luiz Henrique de F...
    蘇黎九歌閱讀 13,836評(píng)論 0 38
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理程帕,服務(wù)發(fā)現(xiàn)住练,斷路器,智...
    卡卡羅2017閱讀 134,715評(píng)論 18 139
  • 1骆捧、網(wǎng)易游戲收入首超騰訊游戲 當(dāng)龍圖游戲《刀塔傳奇》火爆之后澎羞,網(wǎng)易旗下《夢(mèng)幻西游》手游長期霸榜蘋果游戲類下載榜榜首...
    老何職堂閱讀 653評(píng)論 0 3
  • 范季康閱讀 123評(píng)論 0 0
  • 獬豸_6c8e閱讀 210評(píng)論 0 0