美文网首页程序员
Electron与C++互调(FFI方式)

Electron与C++互调(FFI方式)

作者: 妖精不语 | 来源:发表于2018-03-13 16:01 被阅读0次

    在做这个的时候踩了一些坑,网上查到的资料跟着做下来有问题。现整理如下:

    预备

    先安装node.js和python2.7(必须是2.7的版本)。

    新建项目

    执行如下命令(demo为项目名称)

    mkdir demo
    cd demo
    npm init
    

    (npm太慢的话,请用cnpm)

    安装electron及相关编译工具和头文件

    sudo npm install -g prebuild node-gyp electron
    npm install ffi bindings --save
    

    重编ref/ffi

    下面-t后面的1.8.3是你的electron版本号。(注:网上很多资料里,写的不是-t而是-b。这样执行会报错。)

    cd node_modules/ref && prebuild -t 1.8.3 -r electron; cd -
    cd node_modules/ffi && prebuild -t 1.8.3 -r electron; cd -
    

    编写C++代码

    新建头文件:native/demo.h

    extern "C"
    {
        double Add(double a, double b);
    }
    
    

    新建文件:native/demo.cpp

    #include "demo.h"
    double Add(double a, double b){
      return a+b;
    }
    

    注:ffi支持的是C接口,所以要加上extern "C"。(网上资料只写了创建demo.cc,.cc是C++源文件后缀。会导致库里的接口为C++符号。ffi 在LoadLibrary的时候会报找不到符号。)

    编译动态库

    gcc -g -shared  demo.cpp -o libdemo.dylib
    

    使用命令nm libdemo.dylib,查看动态库的符号,是不是包含_Add。nm没有的话,安装一下。

    编写Electron的入口(index.js):

    写个普通的就行

    编写index.html,调用C++

    <!DOCTYPE html>
    <html>
    <script>
    var ffi = require('ffi');
    //路径不用.dylib后缀
    var demo = ffi.Library('./native/libdemo', {
      'Add': [ 'double', [ 'double', 'double'] ]
    });
    
    window.onload = function() {
        console.log(demo.Add(12345, 54321));
    }
    </script>
    </html>
    

    测试效果:

    在demo目录下,执行 electron .

    C++回调与其他资料

    https://github.com/node-ffi/node-ffi/wiki/Node-FFI-Tutorial

    demo地址

    git@github.com:pinkydodo/ElectronAndCppDemo.git

    windows相关

    window基本可以走相似的流程。网上找的其他流程会在require("ffi")时报错。
    另外,window上遇到了32和64位不兼容的问题。electron是有32位和64位的版本的。编动态库的时候,需要和electron的32/64保持一致。

    参考:http://blog.csdn.net/absurd/article/details/53856193

    相关文章

      网友评论

        本文标题:Electron与C++互调(FFI方式)

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