美文网首页
在electron中使用ffi调用C++动态库

在electron中使用ffi调用C++动态库

作者: holidayPenguin | 来源:发表于2021-07-13 10:14 被阅读0次

    node@10.17.0 不建议使用最新版本(https://nodejs.org/download/release/v10.17.0/
    Python 版本windows-build-tools会自动安装
    Visual Studio 版本windows-build-tools会自动安装
    win10系统

    前言

    electron以nodejs作为底层运行环境,所以自然而然就想到了他能否调用C++编写的动态库,恰好我最近在做一个关于使用electron调用dll的项目,也就花了一点时间去了解和实践,这期间走了不少弯路,这里分享出来,希望能帮助到有遇到相关问题的小伙伴

    很多刚入门不久的小伙伴第一个问题可能就是electron能不能调用DLL动态库?这里给一个明确的答复是可以的。为什么?因为electron本身就集成了nodejs运行环境,而nodejs又是用C++实现的,相当于C++是他的原配。
    既然能调用,那么第二个问题来了,怎么调用?nodejs在官网也给出了方案addon有兴趣的可以看看,但是对于我们前端来说这个方案太过于复杂了,学习成本太高,如果没有c++开发背景还是另辟蹊径吧,electron是可以做到和C++混合开发的,如果团队中有C++的开发人员也可以尝试,结合C++本身的优势,开发出来的产品效果可能会更好,我们常用的IDE工具VSCode其实有部分功能也是使用C++来时实现的,这其中规避了一些electron的缺点。

    使用node-ffi(官方)

    另一种调用DLL动态库的方案就是这里要重点介绍的模块node-ffi。

    node-ffi是一个用于使用纯JavaScript加载和调用动态库的Node.js插件。它可以用来在不编写任何C ++代码的情况下创建与本地DLL库的绑定。同时它负责处理跨JavaScript和C的类型转换。

    其实这个模块时用起来非常的简单,先贴一段官方使用案例,简单加了几句注释:

    var ffi = require('ffi');//引入ffi模块
    /*
     *使用ffi模块将dll和js打通,可以把它看做是RPC(远程调用协议)
     *@libm 动态库的绝对地址例如"C://plugin/test.dll"
     *@ceil 动态库中方法的名称 double返回值的数据类型 ['double'] 这是函数输入参数的数据类型
     *这里提一下,应为C++是是属于强类型语言这个js不同,所以这里一定要指定返回参数和输入参数的类型
    */
    var libm = ffi.Library('libm', {
      'ceil': [ 'double', [ 'double' ] ]
    });
    //通过上面的注册的libm对象来调用dll中的ceil方法
    libm.ceil(1.5); // 2
    

    这一切看起来就是这么简单,但是在这几句简单的代码后面,会让刚入门的小伙伴非常的蛋疼,因为在使用的过程中你会遇到各种问题,而且这些问题会让你对本身的目的产生动摇,目前公开的环境能够支持nodejs调用的dll的npm包好像就只有ffi,而在使用中出现的问题,貌似你尝试了所有解决问题的方案,最终还是解决不了。我自己在搞这个的时候也弄了大概一周时间,各种环境捣腾,各种测试。最后弄出来了,这里总结一下这个过程中遇见的问题,打开分为这么3点:

    • 安装依赖时报错
    • 安装成功但是在运行electron时调用ffi时报错
    • 打包electron时报错

    修改nvm镜像地址

    这里默认是指向淘宝地址https://npm.taobao.org/mirrors/node nvm install 4,修改成官方地址https://nodejs.org/dist比较好,windows系统在环境变量里面涉及即可

    To use a mirror of the node binaries, set $NVM_NODEJS_ORG_MIRROR:

    export NVM_NODEJS_ORG_MIRROR=https://nodejs.org/dist
    nvm install node
    
    NVM_NODEJS_ORG_MIRROR=https://nodejs.org/dist nvm install 4.2
    

    To use a mirror of the io.js binaries, set $NVM_IOJS_ORG_MIRROR:

    export NVM_IOJS_ORG_MIRROR=https://iojs.org/dist
    nvm install iojs-v1.0.3
    
    NVM_IOJS_ORG_MIRROR=https://iojs.org/dist nvm install iojs-v1.0.3
    

    安装依赖

    如果已经安装了node-gyp,则需要先删除C:\Users\Administrator.node-gyp 目录,再卸载npm uninstall node-gyp

    //全局安装原生模块编译模块,编译ffi模块时需要用到的,这里一定要安装*
    npm install node-gyp -g
    
    //安装ffi模块
    npm install ffi --save
    

    当我们安装[node-gyp](https://github.com/nodejs/node-gyp)的时候还可以,但是安装[ffi](https://github.com/node-ffi/node-ffi)的时候提示我们需要安装PythonVisual Studio去编译C++

    1. 安装windows-build-tools
    npm install --global --production windows-build-tools 
    

    这一步挺慢的,会自动下载安装PythonVisual Studio需要的插件,而且最好是使用管理员权限打开的控制台。

    会分两步下载,文件下载并安装到 C:\Users\Administrator.windows-build-tools


    下载安装包 安装并下载组件 vs安装进程 Visual Studio 15 版本 安装的工具
    1. PythonVisual Studio安装好以后去安装ffi

    安装前需要手动向系统环境变量Path加入python的安装路径 C:\Users\Administrator.windows-build-tools\python27

    //安装ffi模块
    npm install ffi --save
    
    image.png

    安装成功

    其他安装方式

    https://www.npmjs.com/package/@mapbox/node-pre-gyp

    https://www.cnblogs.com/w4ngzhen/p/14086497.html

    在node中运行

    基于FFI模块CAPI与JavaScript的各种类型匹配总结

    在electron中运行

    打包

    参考

    https://nodejs.org/download/release/v10.17.0/
    https://github.com/nodejs/node-gyp
    https://github.com/node-ffi/node-ffi
    https://github.com/node-ffi/node-ffi/wiki/Node-FFI-Tutorial
    https://github.com/torycl/node-ffi
    https://www.npmjs.com/package/electron-node-ffi
    https://www.cnblogs.com/lonny/p/NVM_NODEJS_ORG_MIRROR.html

    https://blog.csdn.net/wang839305939/article/details/83780789
    https://juejin.cn/post/6844903645905977357

    相关文章

      网友评论

          本文标题:在electron中使用ffi调用C++动态库

          本文链接:https://www.haomeiwen.com/subject/pnarpltx.html