本篇将讲解node.js如何通过调用c++提供的DLL接口来实现更底层的功能。nodejs开发环境的搭建可以参考我第一篇的介绍https://blog.csdn.net/dm569263708/article/details/97394690
一、介绍
js调用c++可以通过多种方式实现,本文介绍的是通过ffi来调用dll。
二、环境配置
安装ffi有2种方式:
- 在项目目录里面输入:npm install ffi
- 在package.json文件里面配置ffi属性,在项目目录里面输入:npm install。 这时会自动根据配置的属性安装项目需要的运行环境。
- 安装完成后需要重新编译ffi模块,命令:.\node_modules\.bin\electron-rebuild
三、代码调用
编写一个简单的c++导出库dll,注意导出接口需要按照C的格式。
extern "C" __declspec(dllexport) int fnTestDll()
{
return 42;
}
js代码如下:
const ffi = require('ffi');
const ref = require('ref');
const path = require('path');
const libpath = path.join(__dirname, './sdk/test.dll');
const sdkLib = ffi.Library(libpath, {
'fnTestDll': ['int', []],
});
var bInit=sdkLib.fnTestDll();
四、注意可能会遇到的坑
1.传递参数
传递指针类型如 int* 需要用到 ref.refType('int'),char*可以直接使用string。
'test': ['int', [ref.refType('int')]],
'test2': ['bool', ['int','string','int','bool']],
结构体
typedef struct {
byte UID[16];
byte UType[6];
int ProdNo;
int ProdPrice;
} DishInfo;
转换的js格式如下
var refStruct = require('ref-struct');
var refArray = require('ref-array');
var DishInfo = refStruct({
'UID': refArray('byte', 16),
'UType': refArray('byte', 6),
'ProdNo': ref.types.int,
'ProdPrice': ref.types.int
});
2.编译错误
A JavaScript error occurred in the main process
Uncaught Exception:
Error: The module '/home/flyahed/electron/zezeta/node_modules/robotjs/build/Release/robotjs.node'
was compiled against a different Node.js version using
NODE_MODULE_VERSION 48. This version of Node.js requires
NODE_MODULE_VERSION 64. Please try re-compiling or re-installing
the module (for instance, using `npm rebuild` or `npm install`).
at process.module.(anonymous function) [as dlopen] (ELECTRON_ASAR.js:166:20)
at Object.Module._extensions..node (internal/modules/cjs/loader.js:740:18)
at Object.module.(anonymous function) [as .node] (ELECTRON_ASAR.js:166:20)
at Module.load (internal/modules/cjs/loader.js:620:32)
at tryModuleLoad (internal/modules/cjs/loader.js:559:12)
at Function.Module._load (internal/modules/cjs/loader.js:551:3)
at Module.require (internal/modules/cjs/loader.js:658:17)
at require (internal/modules/cjs/helpers.js:20:18)
at Object.<anonymous> (/home/flyahed/electron/zezeta/node_modules/robotjs/index.js:1:170)
at Object.<anonymous> (/home/flyahed/electron/zezeta/node_modules/robotjs/index.js:38:3)
需要注意的是,node和electron的版本选择十分重要,如果它们的NODE_MODULE_VERSION版本不一致会报这个错。node的内核版本可以通过这个地址查看https://nodejs.org/zh-cn/download/releases/。
解决办法:下载NODE_MODULE_VERSION版本一致的node和electron进行安装。参考我的版本配置
关于node.js开发环境的搭建可以参考我的上一篇博客:https://blog.csdn.net/dm569263708/article/details/97394690