在 Node.js 中使用C++

這幾天在看 Node.js 的官方文檔,看到了 C++ 插件部分,由於很久沒有接觸 C/C++ 了,看起來着實吃力,決定寫一個 Hello World 後跳過該部分。

在 Node.js 上使用 C++,需要用 node-gyp 工具對 C++ 文件進行編譯,所以首先要安裝 node-gyp :

npm install -g node-gyp

然後在項目目錄下寫一個 hello.cc 文件:

#include <node.h>

namespace demo{
    using v8::FunctionCallbackInfo;
    using v8::Isolate;
    using v8::Local;
    using v8::Object;
    using v8::String;
    using v8::Value;
    using v8::Number;

    // Method1 實現一個 輸出"hello world ONE !" 的方法
    void Method1(const FunctionCallbackInfo<Value>& args){
        Isolate* isolate = args.GetIsolate();
        args.GetReturnValue().Set(String::NewFromUtf8(isolate, "hello world ONE !"));
    }

    // Method2 實現一個 加一 的方法
    void Method2(const FunctionCallbackInfo<Value>& args){
        Isolate* isolate = args.GetIsolate();
        // 獲取參數,js Number 類型轉換成 v8 Number 類型 
        Local<Number> value = Local<Number>::Cast(args[0]); 
        double num = value->NumberValue() + 1;

        // double 轉 char*,這裏我不知道有沒有其他辦法
        char buf[128] = {0};
        sprintf(buf,"%f", num);

        args.GetReturnValue().Set(String::NewFromUtf8(isolate, buf));
    }

    void init(Local<Object> exports){
        NODE_SET_METHOD(exports, "hello1", Method1);
        NODE_SET_METHOD(exports, "addOne", Method2);
    }

    NODE_MODULE(addon, init)
}

按照我的理解,Method1、Method2就是我們爲這個 C++ 插件提供的功能,其參數是個回調函數,args.GetReturnValue().Set() 方法應該是輸出了這個函數的返回值,也就是在 js 中調用這個函數得到相應返回值。

Node.js插件必須導出一個具有如下模式的初始化函數:

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

官網上說 NODE_MODULE 後面沒有分號,因爲他不是一個函數(一臉懵逼)。在上面的 hello.cc 文件中,初始化函數是 init,插件模塊名爲 addon。NODE_SET_METHOD 是對插件輸出的函數命名。

接下來就要對這個文件編譯成 Node.js 的插件了,首先需要一個配置文件。在項目目錄中建立一個 binding.gyp 的文件,這個文件會被 node-gyp 使用到:

{
    "targets": [
        {
            "target_name": "addon",
            "sources": ["hello.cc"]
        }
    ]
}

然後在項目目錄下使用 node-gyp configure 命令,這樣在 Windows 上會得到一個 build 文件夾:

build
    │  addon.vcxproj
    │  addon.vcxproj.filters
    │  binding.sln
    │  config.gypi
    │
    └─Release
        └─obj
            └─addon
                └─addon.tlog

然後繼續使用 node-gyp build 命令,成功後在 build/Release 文件夾下有個 addon.node 的二進制文件,這就是最終得到的 C++ 插件,可以在 js 中調用下:

const addon = require('./build/Release/addon.node');

console.log(addon.hello1());
console.log(addon.addOne(2));

輸出:

hello world ONE !
3.000000

到此一個 Node.js 中 C++ 插件的 Hello World 結束。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章