在 nodejs
/ elctron
中,可以通过 node-ffi ,通过 Foreign Function Interface
调用动态链接库,俗称调DLL,实现调用C/C++代码,从而实现许多node不好实现的功能,或复用诸多已实现的函数功能。
node-ffi是一个用于使用纯 JavaScript 加载和调用动态库的Node.js插件。它可以用来在不编写任何C ++代码的情况下创建与本地DLL库的绑定。同时它负责处理跨JavaScript和C的类型转换。
与 Node.js Addons
相比,此方法有如下优点:
与 Node.js Addons 相比,此方法有如下优点:
- 不需要源代码。
- 不需要每次重编译
node
,Node.js Addons
引用的.node
会有文件锁,会对`electron应用热更新造成麻烦。- 不要求开发者编写C代码,但是仍要求开发者具有一定C的知识。
复制代码
缺点是:
- 性能有折损
- 类似其他语言的FFI调试,此方法近似黑盒调用,差错比较困难。
复制代码
安装
node-ffi
通过 Buffer
类,在C代码和JS代码之间实现了内存共享,类型转换则是通过 ref、 ref-array 、 ref-struct 实现。由于 node-ffi
/ ref
包含C原生代码,所以安装需要配置Node原生插件编译环境。
npm install ffi
npm install ref
npm install ref-array
npm install ref-struct
解决办法
下面是可能出现的问题及解决办法
我这里遇到的问题是
gyp ERR! build error
gyp ERR! stack Error: `make` failed with exit code: 2
gyp ERR! stack at ChildProcess.onExit (/usr/local/lib/node_modules/npm/node_modules/node-gyp/lib/build.js:269:23)
gyp ERR! stack at ChildProcess.emit (events.js:110:17)
gyp ERR! stack at Process.ChildProcess._handle.onexit (child_process.js:1074:12)
gyp ERR! System Linux 3.19.0-26-generic
gyp ERR! command "node" "/usr/local/lib/node_modules/npm/node_modules/node-gyp/bin/node-gyp.js" "rebuild"
gyp ERR! cwd /usr/local/lib/node_modules/protractor/node_modules/selenium-webdriver/node_modules/ws/node_modules/utf-8-validate
gyp ERR! node -v v0.12.4
gyp ERR! node-gyp -v v2.0.2
gyp ERR! not ok
解决办法
$ npm cache clean
$ rm -rf node_modules
$ rm -rf ~/.node-gyp
删除当前用户目录下的.node-gyp文件夹及.npmrc文件