文档章节

Node.js C++扩展实现

yushulx
 yushulx
发布于 2015/06/02 09:40
字数 813
阅读 4434
收藏 12

因为有了Node.js,JavaScript可以被用于服务端编程。通过各种扩展,Node.js可以变得非常强大。今天分享下怎样用C++创建Node.js扩展。

参考原文:Making Dynamsoft Barcode SDK an Addon for Node.js

搭建Nodejs开发环境

要构建扩展,需要安装node-gyp

npm install -g node-gyp

这个库里面包涵了JavaScript v8引擎所需要的头文件以及依赖库。

创建一个C/C++文件dbr.cc以及配置文件binding.gyp。打开配置文件,在里面加入扩展名和源代码文件:

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

现在就可以用来构建dbr.node,用于Node.js的动态链接库,相当于DLL。在命令行中输入:

node-gyp configure install

这行命令干了两件事,首先生成了Visual Studio的工程文件。然后调用VS的编译器生成了动态链接库。可以看下生成的文件结构:

build
    / binding.sln
    / dbr.vcxproj
    / dbr.vcxproj.filters
    / config.gypi
    / Release
        / dbr.node
        / dbr.pdb
        / obj

更多内容可以参考官方文档Node.js addons

把Dynamsoft Barcode SDK封装成Node.js扩展

接下来我们只需要使用Visual Studio来编写代码,构建工程就可以了。因为node-gyp在配置的时候已经把工程文件里的头文件路径和依赖库路径都加进去了,我们只需要做很小的修改。现在双击binding.sln导入工程。添加Dynamsoft Barcode SDK相关的头文件路径和库路径。最后添加post-build event用于拷贝DLL到生成目录:

copy "{installation directory}\Dynamsoft\Barcode Reader 2.0 Trial\Redist\C_C++\*.dll" "$(OutDir)"

现在开始编写C++代码。和Java,Python类似,在编写native代码的时候,需要首先注册native函数。初始化Barcode解码接口:

void Init(Handle<Object> exports) {
    NODE_SET_METHOD(exports, "decodeFile", DecodeFile);
}
 
NODE_MODULE(dbr, Init)

接下来我们把获取的数据转换成v8数据类型。使用Local<Object>来存储一个Barcode结果,使用Local<Array>来存储所有的Local<Object>。最后通过回调函数把结果返回到JavaScript层。

void DecodeFile(const FunctionCallbackInfo<Value>& args) {
 
    Isolate* isolate = Isolate::GetCurrent();
    HandleScope scope(isolate);
 
    // convert v8 string to char *
    String::Utf8Value utfStr(args[0]->ToString());
    char *pFileName = *utfStr;
 
    int option_iMaxBarcodesNumPerPage = -1;
    int option_llBarcodeFormat = -1;
 
    pBarcodeResultArray pResults = NULL;
    ReaderOptions option;
    SetOptions(&option, option_iMaxBarcodesNumPerPage, option_llBarcodeFormat);
 
    // decode barcode image file
    int ret = DBR_DecodeFile(
        pFileName,
        &option,
        &pResults
        );
 
    if (ret == DBR_OK){
        int count = pResults->iBarcodeCount;
        pBarcodeResult* ppBarcodes = pResults->ppBarcodes;
        pBarcodeResult tmp = NULL;
 
        // javascript callback function
        Local<Function> cb = Local<Function>::Cast(args[1]);
        const unsigned argc = 1;
 
        // array for storing barcode results
        Local<Array> barcodeResults = Array::New(isolate);
 
        for (int i = 0; i < count; i++)
        {
            tmp = ppBarcodes[i];
 
            Local<Object> result = Object::New(isolate);
            result->Set(String::NewFromUtf8(isolate, "format"), Number::New(isolate, tmp->llFormat));
            result->Set(String::NewFromUtf8(isolate, "value"), String::NewFromUtf8(isolate, tmp->pBarcodeData));
 
            barcodeResults->Set(Number::New(isolate, i), result);
        }
 
        // release memory
        DBR_FreeBarcodeResults(&pResults);
 
        Local<Value> argv[argc] = { barcodeResults };
        cb->Call(isolate->GetCurrentContext()->Global(), argc, argv);
    }
}

文档可以参考v8.h以及Chrome V8

现在创建一个JavaScript脚本文件测试一下:

var dbr = require('./build/Release/dbr');
var readline = require('readline');
 
var rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout
});
 
rl.question("Please input a barcode image path: ", function(answer) {
  // e.g. F:\git\Dynamsoft-Barcode-Reader\Images\AllSupportedBarcodeTypes.tif
  dbr.decodeFile(
    answer,
    function(msg){
      var result = null;
      for (index in msg) {
        result = msg[index]
        console.log(result['format']);
        console.log(result['value']);
        console.log("##################");
      }
    }
  );
 
  rl.close();
});

最后通过命令行运行查看结果:

源码

https://github.com/dynamsoft-dbr/nodejs

本文转载自:http://www.codepool.biz/making-barcode-addon-for-nodejs.html

yushulx
粉丝 29
博文 107
码字总数 60955
作品 0
杭州
私信 提问
用NAN写一个nodejs的c++扩展

NAN介绍 NAN的全称为Native Abstraction for Node.js, 其表现上是一个Node.js包。安装后,就得到一堆C++头文件,里面是一堆宏。它主要为Node.js和V8跨版本提供了封装的宏,使得开发者不用关心...

warjiang
01/06
0
0
结合源码分析 Node.js 模块加载与运行原理

Node.js 的出现,让 JavaScript 脱离了浏览器的束缚,进入了广阔的服务端开发领域。而 Node.js 对 CommonJS 模块化规范的引入,则更是让 JavaScript成为了一门真正能够适应大型工程的语言。 ...

技术小能手
2018/08/17
0
0
简单上手nodejs调用c++(c++和js的混合编程)

因为项目的原因,最近经常使用node.js搭RESTful接口。 性能还是很不错啦,感觉比Spring Boot之类的要快。而且在不错的性能之外,只要程序结构组织好,别让太多的回调把程序结构搞乱,整体开发...

俺踏月色而来
2018/08/02
0
0
libnode 0.4.1 发布,C++ 版本的 Node.js

libnode 0.4.1 默认使用 C++11,增加一些新的方法,同时将 crypto/rsa 移到扩展目录;libj 更新到 0.8.3 版本。 libnode 是 C++ 语言版的 Node.js,和 Node.js 一样,libnode 提供了非堵塞的...

oschina
2013/11/17
1K
1
nodejs的C++扩展中实现异步回调

在nodejs的官方网站中有关于C++扩展的详细说明,其中包含了从"hello world"到对象封装的一系列示例。其中的“callback”节是关于回调函数的,美中不足的是,这个回调是阻塞的回调。 官方示例...

GZShi_alpha
2014/07/01
4.8K
2

没有更多内容

加载失败,请刷新页面

加载更多

可见性有序性,Happens-before来搞定

写在前面 上一篇文章并发 Bug 之源有三,请睁大眼睛看清它们 谈到了可见性/原子性/有序性三个问题,这些问题通常违背我们的直觉和思考模式,也就导致了很多并发 Bug 为了解决 CPU,内存,IO ...

tan日拱一兵
15分钟前
2
0
网络七层模型与TCP/UDP

为了使全球范围内不同的计算机厂家能够相互之间能够比较协调的进行通信,这个时候就有必要建立一种全球范围内的通用协议,以规范各个厂家之间的通信接口,这就是网络七层模型的由来。本文首先...

爱宝贝丶
18分钟前
2
0
Jenkins World 贡献者峰会及专家答疑展位

本文首发于:Jenkins 中文社区 原文链接 作者:Marky Jackson 译者:shunw Jenkins World 贡献者峰会及专家答疑展位 本文为 Jenkins World 贡献者峰会活动期间的记录 Jenkins 15周岁啦!Jen...

Jenkins中文社区
36分钟前
8
0
杂谈:面向微服务的体系结构评审中需要问的三个问题

面向微服务的体系结构如今风靡全球。这是因为更快的部署节奏和更低的成本是面向微服务的体系结构的基本承诺。 然而,对于大多数试水的公司来说,开发活动更多的是将现有的单块应用程序转换为...

liululee
50分钟前
7
0
OSChina 周二乱弹 —— 我等饭呢,你是不是来错食堂了?

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @ 自行车丢了:给主编推荐首歌 《クリスマスの夜》- 岡村孝子 手机党少年们想听歌,请使劲儿戳(这里) @烽火燎原 :国庆快来,我需要长假! ...

小小编辑
今天
534
9

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部