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



推荐阅读
  • Java在运行已编译完成的类时,是通过java虚拟机来装载和执行的,java虚拟机通过操作系统命令JAVA_HOMEbinjava–option来启 ... [详细]
  • ShiftLeft:将静态防护与运行时防护结合的持续性安全防护解决方案
    ShiftLeft公司是一家致力于将应用的静态防护和运行时防护与应用开发自动化工作流相结合以提升软件开发生命周期中的安全性的公司。传统的安全防护方式存在误报率高、人工成本高、耗时长等问题,而ShiftLeft提供的持续性安全防护解决方案能够解决这些问题。通过将下一代静态代码分析与应用开发自动化工作流中涉及的安全工具相结合,ShiftLeft帮助企业实现DevSecOps的安全部分,提供高效、准确的安全能力。 ... [详细]
  • 本文介绍了在Windows环境下如何配置php+apache环境,包括下载php7和apache2.4、安装vc2015运行时环境、启动php7和apache2.4等步骤。希望对需要搭建php7环境的读者有一定的参考价值。摘要长度为169字。 ... [详细]
  • Android源码深入理解JNI技术的概述和应用
    本文介绍了Android源码中的JNI技术,包括概述和应用。JNI是Java Native Interface的缩写,是一种技术,可以实现Java程序调用Native语言写的函数,以及Native程序调用Java层的函数。在Android平台上,JNI充当了连接Java世界和Native世界的桥梁。本文通过分析Android源码中的相关文件和位置,深入探讨了JNI技术在Android开发中的重要性和应用场景。 ... [详细]
  • 如何搭建Java开发环境并开发WinCE项目
    本文介绍了如何搭建Java开发环境并开发WinCE项目,包括搭建开发环境的步骤和获取SDK的几种方式。同时还解答了一些关于WinCE开发的常见问题。通过阅读本文,您将了解如何使用Java进行嵌入式开发,并能够顺利开发WinCE应用程序。 ... [详细]
  • intellij idea的安装与使用(保姆级教程)
    intellijidea的安装与使用(保姆级教程)IntelliJ在业界被公认为最好的java开发工具,尤其在智能代码助手、代码自动提示、重构、JavaEE支持、各类版本工具(gi ... [详细]
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
  • 如何在服务器主机上实现文件共享的方法和工具
    本文介绍了在服务器主机上实现文件共享的方法和工具,包括Linux主机和Windows主机的文件传输方式,Web运维和FTP/SFTP客户端运维两种方式,以及使用WinSCP工具将文件上传至Linux云服务器的操作方法。此外,还介绍了在迁移过程中需要安装迁移Agent并输入目的端服务器所在华为云的AK/SK,以及主机迁移服务会收集的源端服务器信息。 ... [详细]
  • 本文讨论了在数据库打开和关闭状态下,重新命名或移动数据文件和日志文件的情况。针对性能和维护原因,需要将数据库文件移动到不同的磁盘上或重新分配到新的磁盘上的情况,以及在操作系统级别移动或重命名数据文件但未在数据库层进行重命名导致报错的情况。通过三个方面进行讨论。 ... [详细]
  • 本文介绍了在Mac上安装Xamarin并使用Windows上的VS开发iOS app的方法,包括所需的安装环境和软件,以及使用Xamarin.iOS进行开发的步骤。通过这种方法,即使没有Mac或者安装苹果系统,程序员们也能轻松开发iOS app。 ... [详细]
  • 本文介绍了如何在Azure应用服务实例上获取.NetCore 3.0+的支持。作者分享了自己在将代码升级为使用.NET Core 3.0时遇到的问题,并提供了解决方法。文章还介绍了在部署过程中使用Kudu构建的方法,并指出了可能出现的错误。此外,还介绍了开发者应用服务计划和免费产品应用服务计划在不同地区的运行情况。最后,文章指出了当前的.NET SDK不支持目标为.NET Core 3.0的问题,并提供了解决方案。 ... [详细]
  • 本文介绍了JavaScript进化到TypeScript的历史和背景,解释了TypeScript相对于JavaScript的优势和特点。作者分享了自己对TypeScript的观察和认识,并提到了在项目开发中使用TypeScript的好处。最后,作者表示对TypeScript进行尝试和探索的态度。 ... [详细]
  • 本文介绍了在Linux系统下进行文件压缩与解压的常用命令,包括tar命令的基本使用和参数,以及gzip、bz2、compress、rar和zip等不同格式的压缩与解压方法。同时还提供了常见的压缩文件后缀名及对应的解压命令,方便用户进行文件的压缩和解压操作。 ... [详细]
  • 本文介绍了在Ubuntu 11.10 x64环境下安装Android开发环境的步骤,并提供了解决常见问题的方法。其中包括安装Eclipse的ADT插件、解决缺少GEF插件的问题以及解决无法找到'userdata.img'文件的问题。此外,还提供了相关插件和系统镜像的下载链接。 ... [详细]
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社区 版权所有