程序员

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

2018-03-13  本文已影响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

上一篇下一篇

猜你喜欢

热点阅读