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保持一致。