热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

如何在Ubuntu上创建Node.jsAddon

2019独角兽企业重金招聘Python工程师标准上次分享过Windows上的node.js扩展实现。今天分享下如何在Linux平台上,通过封装Dynamsoft

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

上次分享过Windows上的node.js扩展实现。今天分享下如何在Linux平台上,通过封装Dynamsoft Barcode SDK for Linux (dbr)来创建node.js barcode addon。

参考原文:How to Make Node Barcode Reader Addon on Linux

作者:Xiao Ling

翻译:yushulx

软件下载

在Ubuntu上一般习惯用apt-get来安装软件。如果是这样操作,下载的node和npm版本都会比较旧。编译V8 C/C++代码的时候会出现错误‘FunctionCallbackInfo’ does not name a type:

29111950_kGu8.png

安装Node

从官网下载最新版本的Linux Node:node-v5.3.0-linux-x64.tar.gz.

解压:

tar -xzf node-v5.3.0-linux-x64.tar.gz

打开.bashrc:

nano ~/.bashrc

导出node的路径并保存文件:

export PATH=$(YOUR_HOME)/Downloads/node-v5.3.0-linux-x64/bin:$PATH

安装node-gyp:

npm install -g node-gyp

安装DBR

下载v4.0.0-pre-alpha.tar.gz 。

解压:

tar -xzf v4.0.0-pre-alpha.tar.gz

为了方便编译的时候找到SDK中提供的*.so动态链接库,创建一个符号链接:

sudo ln -s $(DynamsoftBarcodeReader)/Redist/libDynamsoftBarcodeReaderx64.so /usr/lib/libDynamsoftBarcodeReaderx64.so

创建Node Barcode Addon

创建文件 binding.gyp,在里面添加目标名,源码路径,include路径,以及依赖库的路径。

{"targets": [{"target_name": "dbr","sources": [ "dbr.cc" ],"include_dirs" : ["$(DynamsoftBarcodeReader)/Include"],"libraries": ["-lDynamsoftBarcodeReaderx64", "-L$(DynamsoftBarcodeReader)/Redist"]}]
}

参考SDK中提供的sample,创建dbr.cc:

#include 
#include "If_DBR.h"
#include "BarcodeFormat.h"
#include "BarcodeStructs.h"
#include "ErrorCode.h"using namespace v8;// Barcode format
const char * GetFormatStr(__int64 format)
{if (format == CODE_39)return "CODE_39";if (format == CODE_128)return "CODE_128";if (format == CODE_93)return "CODE_93";if (format == CODABAR)return "CODABAR";if (format == ITF)return "ITF";if (format == UPC_A)return "UPC_A";if (format == UPC_E)return "UPC_E";if (format == EAN_13)return "EAN_13";if (format == EAN_8)return "EAN_8";if (format == INDUSTRIAL_25)return "INDUSTRIAL_25";if (format == QR_CODE)return "QR_CODE";if (format == PDF417)return "PDF417";if (format == DATAMATRIX)return "DATAMATRIX";return "UNKNOWN";
}void DecodeFile(const FunctionCallbackInfo& args) {Isolate* isolate &#61; Isolate::GetCurrent();HandleScope scope(isolate);// convert v8 string to char *String::Utf8Value fileName(args[0]->ToString());String::Utf8Value license(args[1]->ToString());char *pFileName &#61; *fileName;char *pszLicense &#61; *license;// Dynamsoft Barcode Reader: init__int64 llFormat &#61; (OneD | QR_CODE | PDF417 | DATAMATRIX);int iMaxCount &#61; 0x7FFFFFFF;ReaderOptions ro &#61; {0};pBarcodeResultArray pResults &#61; NULL;// Initialize licenseif (pszLicense){printf("license: %s\n", pszLicense);DBR_InitLicense(pszLicense);}elseDBR_InitLicense("AC4561856D63EF392F46D7454052372D");ro.llBarcodeFormat &#61; llFormat;ro.iMaxBarcodesNumPerPage &#61; iMaxCount;// Decode barcode imageint ret &#61; DBR_DecodeFile(pFileName, &ro, &pResults);printf("ret: %d\n", ret);if (ret &#61;&#61; DBR_OK){int count &#61; pResults->iBarcodeCount;pBarcodeResult* ppBarcodes &#61; pResults->ppBarcodes;pBarcodeResult tmp &#61; NULL;// Javascript callback functionLocal cb &#61; Local::Cast(args[2]);const unsigned argc &#61; 1;// array for storing barcode resultsLocal barcodeResults &#61; Array::New(isolate);for (int i &#61; 0; i < count; i&#43;&#43;){tmp &#61; ppBarcodes[i];Local result &#61; 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 memoryDBR_FreeBarcodeResults(&pResults);Local argv[argc] &#61; { barcodeResults };cb->Call(isolate->GetCurrentContext()->Global(), argc, argv);}
}void Init(Handle exports) {NODE_SET_METHOD(exports, "decodeFile", DecodeFile);
}NODE_MODULE(dbr, Init)

通过命令自动创建工程构建的文件&#xff1a;

node-gyp configure

创建之后makefile不需要再进行手动修改了。现在可以构建工程了&#xff1a;

node-gyp build

写一个测试dbr.js&#xff0c;包含读取license以及调用C/C&#43;&#43;接口&#xff1a;

var dbr &#61; require(&#39;./build/Release/dbr&#39;);
var readline &#61; require(&#39;readline&#39;);
var fs &#61; require(&#39;fs&#39;);fs.readFile(&#39;./license.txt&#39;, &#39;utf8&#39;, function (err, data) {if (err) throw err;var rl &#61; readline.createInterface({input: process.stdin,output: process.stdout});var license &#61; data.trim();rl.question("Please input a barcode image path: ", function(answer) {dbr.decodeFile(answer, license,function(msg){var result &#61; null;for (index in msg) {result &#61; msg[index]console.log(result[&#39;format&#39;]);console.log(result[&#39;value&#39;]);console.log("##################");}});rl.close();});
});

运行脚本&#xff1a;

node dbr.js

29111952_XCTo.png

源码

https://github.com/dynamsoftsamples/node-barcode-addon-for-linux



转:https://my.oschina.net/yushulx/blog/552699



推荐阅读
  • 本文详细介绍了如何在 Ubuntu 16.04 系统上配置 Qt 5.5 的交叉编译环境,特别针对 i.MX6 平台进行了优化设置。内容涵盖从基本的软件安装到高级配置的全过程。 ... [详细]
  • 在Ubuntu 18.04上使用Nginx搭建RTMP流媒体服务器
    本文详细介绍了如何在Ubuntu 18.04上使用Nginx和nginx-rtmp-module模块搭建RTMP流媒体服务器,包括环境搭建、配置文件修改和推流拉流操作。适用于需要搭建流媒体服务器的技术人员。 ... [详细]
  • 2023年最新Linux环境下Android开发环境搭建指南
    2023年最新Linux环境下Android开发环境搭建指南,帮助Android开发者在Linux系统上快速搭建开发环境,解决常见的配置问题。 ... [详细]
  • Node.js在服务器上的多种部署策略
    本文探讨了Node.js应用程序在服务器上部署的几种有效方法,包括使用Screen、PM2以及通过宝塔面板进行简易管理。 ... [详细]
  • 利用 Calcurse 在 Linux 终端高效管理日程与任务
    对于喜爱使用 Linux 终端进行日常操作的系统管理员来说,Calcurse 提供了一种强大的方式来管理日程安排、待办事项及会议。本文将详细介绍如何在 Linux 上安装和使用 Calcurse,帮助用户更有效地组织工作。 ... [详细]
  • 本文介绍了如何在不同操作系统上安装Git,以及一些基本和高级的Git操作,包括项目初始化、文件状态检查、版本控制、分支管理、标签处理、版本回退等,并简要提及了开源许可协议的选择。 ... [详细]
  • Flutter 核心技术与混合开发模式深入解析
    本文深入探讨了 Flutter 的核心技术,特别是其混合开发模式,包括统一管理模式和三端分离模式,以及混合栈原理。通过对比不同模式的优缺点,帮助开发者选择最适合项目的混合开发策略。 ... [详细]
  • 在 Ubuntu 22.04 LTS 上部署 Jira 敏捷项目管理工具
    Jira 敏捷项目管理工具专为软件开发团队设计,旨在以高效、有序的方式管理项目、问题和任务。该工具提供了灵活且可定制的工作流程,能够根据项目需求进行调整。本文将详细介绍如何在 Ubuntu 22.04 LTS 上安装和配置 Jira。 ... [详细]
  • AcetoneISO:Ubuntu Linux下的全能虚拟光驱工具
    AcetoneISO 是一款功能强大的虚拟光驱软件,适用于 Linux 和 Mac 系统。它支持多种映像文件格式的挂载和转换,并提供丰富的文件管理功能。 ... [详细]
  • 本文详细介绍了在 Ubuntu 系统上安装和配置 MySQL、Tomcat 和 JDK 的步骤。通过本文,您将了解如何顺利安装这些组件,并确保它们能够正常协同工作。 ... [详细]
  • Ubuntu 环境下配置 LAMP 服务器
    本文详细介绍了如何在 Ubuntu 系统上安装和配置 LAMP(Linux、Apache、MySQL 和 PHP)服务器。包括 Apache 的安装、PHP 的配置以及 MySQL 数据库的设置,确保读者能够顺利搭建完整的 Web 开发环境。 ... [详细]
  • Ubuntu 22.04 安装搜狗输入法详细指南及常见问题解决方案
    本文将详细介绍如何在 Ubuntu 22.04 上安装搜狗输入法,并提供常见问题的解决方法。包括下载安装包、更新源、安装依赖项等步骤。 ... [详细]
  • 阿里云服务器搭建详解——Ubuntu
    由于自己电脑配置跟不上,双系统一开,整个电脑就会变得非常卡顿,所以决定在阿里云买一个云服务器。听朋友说,学生买的话是非常便宜 ... [详细]
  • 本文详细介绍了如何在Linux系统(以CentOS为例)上彻底卸载Zimbra邮件系统,包括停止服务、删除文件和用户等步骤。 ... [详细]
  • 在Windows系统中安装TensorFlow GPU版的详细指南与常见问题解决
    在Windows系统中安装TensorFlow GPU版是许多深度学习初学者面临的挑战。本文详细介绍了安装过程中的每一个步骤,并针对常见的问题提供了有效的解决方案。通过本文的指导,读者可以顺利地完成安装并避免常见的陷阱。 ... [详细]
author-avatar
哇哈时候_206
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有