首頁  >  文章  >  web前端  >  node.js呼叫C 開發的模組實例_node.js

node.js呼叫C 開發的模組實例_node.js

WBOY
WBOY原創
2016-05-16 15:51:341176瀏覽

如何用C 和node交互,在node的程式中,如果有大數據量的計算,處理起來比較慢,可以用C 來處理,然後通過回調(callback的形式),返回給node。先回顧正統的用 C 開發 native 模組的方法

#include <node.h> 
#include <v8.h> 
using namespace v8; 
 
// 这里是 hello 函数的 C++ 实现部分 
Handle<Value> Method(const Arguments& args) { 
 HandleScope scope; 
 return scope.Close(String::New("world")); 
} 
 
// 这里是模块的初始化函数,必须有 
void init(Handle<Object> exports) { 
 exports->Set(String::NewSymbol("hello"), 
   FunctionTemplate::New(Method)->GetFunction()); 
} 
 
// 这里定义本模块的名字和初始化函数 
NODE_MODULE(hello, init)

這個模組用Node 寫的話,是這樣的:

exports.hello = function() { 
 return 'world'; 
};


为了编译 C++ 这个模块,还需要一个 JSON 格式的 binding.gyp 文件,来定义编译的细节。 
{ 
 "targets": [ 
  { 
   "target_name": "hello", 
   "sources": [ "hello.cpp" ] 
  } 
 ] 
}

執行 node-gyp configure build  就直接編譯了。

node test.js: 
var addon = require('./build/Release/hello'); 

console.log(addon.hello()); 

 就輸出結果。

如此node就可以直接呼叫C 所寫的程式。

對上面程式的解釋:在hello.cc 中,我們先建立了一個函數Method, 此函數傳回一個"hello,world"的字串,後面我們又建立了一個init的函數,作為一個初始化函數,我們去呼叫了一個函數

最後面,我們將這個模組綁定為:NODE_MODULE(hello, init)

在官網中指出,所有的node的插件必須輸出一個初始化的函數,也就是說如下程式碼是在每個模組都必須有的,固定格式。

void Initialize (Handle<Object> exports); 
NODE_MODULE(module_name, Initialize) 

其中 module_name 必須對應上binding.gyp中的 target_name 就可以了。

經過了node-gyp configure build 編譯以後會在目前檔案下產生一個build 的新的資料夾。我們透過在test.js中去引用這個build的結果,就可以呼叫C 的寫的程式了。

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn