系列文章目录
第一章 基础概念讲解(本章)
第二章 详解ffi-napi
第三章 详解ref-napi
前言
提示:这里可以添加本文要记录的大概内容:
本系列主要讲解在开发 electron
桌面应用过程中,需要配合使用厂家硬件,调用提供的 DLL
动态链接库的使用,主要案例是使用 虹软人脸识别 进行人脸识别
一、基本概念
ffi
即Foreign Function Interface,外部函数接口,是一个用于使用纯JavaScript加载和调用动态库的Node.js插件。它可以用来在不编写任何C++代码的情况下创建与本地DLL库的绑定
。同时它负责处理跨JavaScript和C的类型转换
。
1、node-ffi 和 ffi-napi
1.1 node-ffi
GitHub仓库
node-ffi是ffi的官方版本,但我们不直接使用,具体下面说。
安装的时候会出现各种错误:
The module xxxxxx was compiled against a different Node.js version using NODE_MODULE_VERSION 69.
This version of Node.js requires NODE_MODULE_VERSION 73
// 直接安装会出现这个问题,这个问题原因是这个模块编译的node版本和你目前使用的node版本不一致,所以解决方法是重新编译。
npm rebuild --runtime=electron --target=6.0.10 --disturl=https://atom.io/download/atom-shell --abi=73
但重新编译又出现了许多错误,具体原因是:
node-ffi里面会
调用v8或其他依赖模块的接口
,而这些接口已经更新了,有的接口改了名字,有的接口改了参数数量。但是node-ffi的调用接口语句并没有更新,所以编译不过。
所以node-ffi
安装会有许多问题,它的介绍到这里。
1.2 ffi-napi
GitHub仓库
ffi-napi
是作者根据 node-ffi
修改发布到npm仓库的,伴随它用到的也一并修改和发布了,解决了上面的问题,所以我们使用 ffi-napi
来调用dll库。 ffi-napi
API基本和 node-ffi
一致,但作者在仓库地址说明了,它在垃圾收集和多线程上有问题,我们不使用它的多线程。
官网教程文档
官方教程文档,在 node-ffi
和 ffi-napi
都是指向了 node-ffi
的文档,因为后者是根据前者改写的。
官方教程
1.3 ref-napi
这个模块定义了很多C/C++的常见数据类型,可以在声明和调用动态库的时候直接使用。
C语言中有4种基础数据类型—-整型、浮点型、指针、聚合类型,我们需要进行类型转换对应,所以需要此模块。
整型、字符型都有分有符号和无符号两种。(在不声明unsigned时 默认为signed型)
1.3.1 ref
ref
和 ref-napi
貌似是同一个东西,只是 ref-napi
是 ffi-napi
配套开发的,是同一个作者,目前我只知道这么多,实际我们使用的也是配套的 ref-napi
。
Github
1.3.2 ref-napi
该库是 napi 系列的库。
特别说明,来自官方说明,Incompatible packages(不兼容的程序包),ref-struct-napi 和 ref-array-napi 看起来也是
napi
系列产品,但不是,在struct
和array
中,配套的是ref-struct-di
和ref-array-di
Github
1.3.3 ref-array-napi 和 ref-array-di
这两个库,配套的是后者,前者不太兼容 napi系列。
这个模块在Node.js中提供了一个数组的实现,在声明和调用函数中,所有的指针都可以声明成一个uchar数组。
array-di
array-napi
1.3.4 ref-struct-napi 和 ref-struct-di
同样,后者是napi的系列库
这个模块在Node.js中提供了一个结构体类型的实现。ROCKEY-ARM的函数很多参数都是结构体指针,如果声明称uchar的数组,那么传出的数据都是uchar数组,解析的时候不方便,需要自己拼接,除了麻烦,还要考虑字节序的问题。如果使用结构体,并定义一个结构体数组来作为指针传入,函数返回的结构体参数,就可以直接用结构体进行解析,会比较方便。(这部分还不太懂,摘抄自参考目录)
struct-di
struct-napi
二、使用步骤
三、总结
参考
https://blog.csdn.net/youngbug/article/details/124280462
https://blog.csdn.net/fuhanghang/article/details/116058577