node.js調(diào)用C++函數(shù)的方法示例
目前nodejs調(diào)用c++主流的有兩種方法,分別是addons和ffi
addons是nodejs官方的c++擴(kuò)展實(shí)現(xiàn)方案,但是由于需要使用模版,并且要對(duì)v8引擎有一定的了解,入門門檻較高。
ffi是nodejs直接調(diào)用so庫(kù)的一種實(shí)現(xiàn),可以調(diào)用純c的接口。
要想node.js調(diào)用C++的函數(shù)等,須先將C++代碼編譯成二進(jìn)制的.node文件。node.js官方文檔https://nodejs.org/dist/latest-v8.x/docs/api/addons.html中的C++ addons介紹了如何將C++的代碼編譯為二進(jìn)制的.node文件。
一、步驟:
1.首先在項(xiàng)目目錄進(jìn)行npm install -g node-gyp下載node-gyp模塊,配置環(huán)境參考https://github.com/nodejs/node-gyp
2.這是node官方文檔中的例子
// addon.cc #include <node.h> namespace demo { using v8::Exception; using v8::FunctionCallbackInfo; using v8::Isolate; using v8::Local; using v8::Number; using v8::Object; using v8::String; using v8::Value;// This is the implementation of the "add" method// Input arguments are passed using the// const FunctionCallbackInfo<Value>& args struct void Add(const FunctionCallbackInfo<Value>& args) { Isolate* isolate = args.GetIsolate(); // Check the number of arguments passed. if (args.Length() < 2) { // Throw an Error that is passed back to JavaScript isolate->ThrowException(Exception::TypeError( String::NewFromUtf8(isolate, "Wrong number of arguments"))); return; } // Check the argument types if (!args[0]->IsNumber() || !args[1]->IsNumber()) { isolate->ThrowException(Exception::TypeError( String::NewFromUtf8(isolate, "Wrong arguments"))); return; } // Perform the operation double value = args[0]->NumberValue() + args[1]->NumberValue(); Local<Number> num = Number::New(isolate, value); // Set the return value (using the passed in // FunctionCallbackInfo<Value>&) args.GetReturnValue().Set(num);} void Init(Local<Object> exports) { NODE_SET_METHOD(exports, "add", Add);}NODE_MODULE(NODE_GYP_MODULE_NAME, Init) } // namespace demo
3.然后在項(xiàng)目目錄下使用類似JSON的格式創(chuàng)建在項(xiàng)目頂層調(diào)用的文件binding.gyp文件,內(nèi)容為
{ "targets": [ { "target_name": "addon", "sources": [ "addon.cc" ] } ] }
4.在終端輸入node-gyp configure命令生成一個(gè)build文件夾,然后輸入node-gyp build命令生成編譯addon.node文件
5.在node文件比如test.js文件中const addon=require(‘./build/Release/addon')調(diào)用生成的模塊
// test.js const addon = require('./build/Release/addon'); console.log('This should be eight:', addon.add(3, 5));//結(jié)果為8
二、實(shí)例
最近公司讓我研究node調(diào)用C++,C++的代碼是調(diào)用了GDAL庫(kù)開發(fā)的功能。要在tile.cc文件中調(diào)用頭文件
這里#include調(diào)用的gdal_priv.h和ogrsf_frmts.h頭文件在gdal/include文件夾中,所以要在binding.gyp文件中source后面添加
"include_dirs": [ "./gdal/include" ],
然后如果現(xiàn)在就運(yùn)行node-gyp configure build命令會(huì)報(bào)“無法解析的外部符號(hào)”的錯(cuò)誤,這是因?yàn)檫€需要加入調(diào)用的鏈接庫(kù),需要在binding.gyp文件中加入
'libraries': [ "../gdal/lib/gdal_i.lib", ],
這時(shí)的binding.gyp文件為
{ "targets": [ { "target_name": "addon", "sources": [ "./C++_02/tile.cc" ], "include_dirs": [ "./gdal/include" ], 'libraries': [ "../gdal/lib/gdal_i.lib", ], } ] }
這時(shí)再進(jìn)行node-gyp configure build命令就不會(huì)報(bào)錯(cuò)生成addon.node文件,但是當(dāng)我運(yùn)行test.js文件
const addon=require(‘./build/Release/addon') var imagefile = "/vsicurl/http://sasmac.oss-cn-beijing.aliyuncs.com/cog.tif"; var x = 160; var y = 83; var l = 9; console.log(addon.tileload(imagefile, x, y, l));
會(huì)報(bào)錯(cuò)'找不到指定的模塊',但是我們?cè)赽uild/Release文件中能找到addon.node文件,這是因?yàn)槿鄙僖蕾囈簿褪侨鄙?dll。下載 Dependency Walker,這個(gè)軟件可以幫你確定一下缺少什么.dll,下載地址:http://www.dependencywalker.com/。我將addon.node文件添加到Dependency Walker發(fā)現(xiàn)缺少gdal/bin中的.dll。我將gdal/bin中的.dll文件復(fù)制到addon.node目錄下,這時(shí)運(yùn)行test.js文件就可以正常使用了。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Node.js中的模塊機(jī)制學(xué)習(xí)筆記
這篇文章主要介紹了Node.js中的模塊機(jī)制學(xué)習(xí)筆記,本文講解了CommonJS模塊規(guī)范、Node模塊實(shí)現(xiàn)過程、模塊調(diào)用棧、包與NPM等內(nèi)容,需要的朋友可以參考下2014-11-11在node中使用jwt簽發(fā)與驗(yàn)證token的方法
這篇文章主要介紹了在node中使用jwt簽發(fā)與驗(yàn)證token的方法,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-04-04Node.js的HTTP模塊、URL模塊與supervisor工具介紹
這篇文章介紹了Node.js的HTTP模塊、URL模塊與supervisor工具,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-06-06node基于express框架操作Mysql數(shù)據(jù)庫(kù)的步驟
這篇文章主要介紹了node基于express框架操作Mysql數(shù)據(jù)庫(kù)的步驟,文章給大家提到安裝mysql模塊和配置mysql模塊的步驟,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-03-03