热门标签 | 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



推荐阅读
  • 如何在Linux系统中实现Windows风格的桌面环境:将Ubuntu 18.04定制为Windows主题界面
    如果您是从Windows转到Linux系统的用户,可能会觉得默认的Ubuntu主题和桌面环境缺乏吸引力和可定制性。尤其是对于习惯了Windows风格的任务栏和主题的用户,Ubuntu 18.04的橙色主题可能显得过于简洁。为了提升用户体验,可以通过安装特定的桌面环境和主题来实现类似Windows的界面效果。本文将详细介绍如何在Ubuntu 18.04中配置和定制桌面环境,使其具备Windows风格的外观和功能。 ... [详细]
  • Linux CentOS 7 安装PostgreSQL 9.5.17 (源码编译)
    近日需要将PostgreSQL数据库从Windows中迁移到Linux中,LinuxCentOS7安装PostgreSQL9.5.17安装过程特此记录。安装环境&#x ... [详细]
  • 本文介绍了如何使用 Node.js 和 Express(4.x 及以上版本)构建高效的文件上传功能。通过引入 `multer` 中间件,可以轻松实现文件上传。首先,需要通过 `npm install multer` 安装该中间件。接着,在 Express 应用中配置 `multer`,以处理多部分表单数据。本文详细讲解了 `multer` 的基本用法和高级配置,帮助开发者快速搭建稳定可靠的文件上传服务。 ... [详细]
  • 帝国CMS中的信息归档功能详解及其重要性
    本文详细解析了帝国CMS中的信息归档功能,并探讨了其在内容管理中的重要性。通过归档功能,用户可以有效地管理和组织大量内容,提高网站的运行效率和用户体验。此外,文章还介绍了如何利用该功能进行数据备份和恢复,确保网站数据的安全性和完整性。 ... [详细]
  • Amoeba 通过优化 MySQL 的读写分离功能显著提升了数据库性能。作为一款基于 MySQL 协议的代理工具,Amoeba 能够高效地处理应用程序的请求,并根据预设的规则将 SQL 请求智能地分配到不同的数据库实例,从而实现负载均衡和高可用性。该方案不仅提高了系统的并发处理能力,还有效减少了主数据库的负担,确保了数据的一致性和可靠性。 ... [详细]
  • 利用ZFS和Gluster实现分布式存储系统的高效迁移与应用
    本文探讨了在Ubuntu 18.04系统中利用ZFS和Gluster文件系统实现分布式存储系统的高效迁移与应用。通过详细的技术分析和实践案例,展示了这两种文件系统在数据迁移、高可用性和性能优化方面的优势,为分布式存储系统的部署和管理提供了宝贵的参考。 ... [详细]
  • 单元测试:使用mocha和should.js搭建nodejs的单元测试
    2019独角兽企业重金招聘Python工程师标准BDD测试利器:mochashould.js众所周知对于任何一个项目来说,做好单元测试都是必不可少 ... [详细]
  • 如何在虚拟机中实现Linux与Windows主机之间的文件夹共享
    为了在虚拟机中实现Linux与Windows主机之间的文件夹共享,首先需要确保Linux系统已安装VMware Tools。如果尚未安装,可以通过虚拟机软件提供的“安装VMware Tools”选项进行安装。安装完成后,通过配置共享文件夹设置,即可实现主机与虚拟机之间的文件互传。此外,建议检查虚拟机网络设置,确保网络连接正常,以提高文件传输的稳定性和速度。 ... [详细]
  • 在Windows系统中安装TensorFlow GPU版的详细指南与常见问题解决
    在Windows系统中安装TensorFlow GPU版是许多深度学习初学者面临的挑战。本文详细介绍了安装过程中的每一个步骤,并针对常见的问题提供了有效的解决方案。通过本文的指导,读者可以顺利地完成安装并避免常见的陷阱。 ... [详细]
  • 在CentOS 7环境中安装配置Redis及使用Redis Desktop Manager连接时的注意事项与技巧
    在 CentOS 7 环境中安装和配置 Redis 时,需要注意一些关键步骤和最佳实践。本文详细介绍了从安装 Redis 到配置其基本参数的全过程,并提供了使用 Redis Desktop Manager 连接 Redis 服务器的技巧和注意事项。此外,还探讨了如何优化性能和确保数据安全,帮助用户在生产环境中高效地管理和使用 Redis。 ... [详细]
  • 您的数据库配置是否安全?DBSAT工具助您一臂之力!
    本文探讨了Oracle提供的免费工具DBSAT,该工具能够有效协助用户检测和优化数据库配置的安全性。通过全面的分析和报告,DBSAT帮助用户识别潜在的安全漏洞,并提供针对性的改进建议,确保数据库系统的稳定性和安全性。 ... [详细]
  • 浏览器作为我们日常不可或缺的软件工具,其背后的运作机制却鲜为人知。本文将深入探讨浏览器内核及其版本的演变历程,帮助读者更好地理解这一关键技术组件,揭示其内部运作的奥秘。 ... [详细]
  • SecureCRT是一款功能强大的终端仿真软件,支持SSH1和SSH2协议,适用于在Windows环境下高效连接和管理Linux服务器。该工具不仅提供了稳定的连接性能,还具备丰富的配置选项,能够满足不同用户的需求。通过SecureCRT,用户可以轻松实现对远程Linux系统的安全访问和操作。 ... [详细]
  • 在Eclipse中提升开发效率,推荐使用Google V8插件以增强Node.js的调试体验。安装方法有两种:一是通过Eclipse Marketplace搜索并安装;二是通过“Help”菜单中的“Install New Software”,在名称栏输入“googleV8”。此插件能够显著改善调试过程中的性能和响应速度,提高开发者的生产力。 ... [详细]
  • 本文详细介绍了在Linux系统上编译安装MySQL 5.5源码的步骤。首先,通过Yum安装必要的依赖软件包,如GCC、GCC-C++等,确保编译环境的完备。接着,下载并解压MySQL 5.5的源码包,配置编译选项,进行编译和安装。最后,完成安装后,进行基本的配置和启动测试,确保MySQL服务正常运行。 ... [详细]
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社区 版权所有