最近公司專案停擺,正好有時間分享下這段時間electron整合ffi踩得坑,應該能幫上有相同需求的童鞋們。
專案背景是這樣的,windows端的應用採用electronJs開發,由於一些複雜的使用常用,端這邊要整合sdk,就是C++編譯的dll檔案,electron這邊呼叫dll就是通過ffi這個庫實現,搭建這個環境可真是一言難盡。
我先來說下,我最終使用的環境和版本
- python 2.7.15
- npm install --global --production windows-build-tools//通過npm的方式安裝windows環境的的C++構建工具包
- node: 版本13.9.0(32bit)
- ffi: 分支ffi-napi 版本2.4.6
幾個tips
- node使用32bit的版本,是因為我們編譯的sdk是有32bit和64bit區別的,64bit的win系統上能跑32bit的程式,所以最終我們打包和使用的sdk都是32bit的
- 安裝過程中的一些錯誤,像環境變數這些,直接百度下怎麼設定
- 切換node版本和arch的話,最好安裝一個nvm,方便切換node
上面使用的ffi-napi同步呼叫dll檔案是沒問題的,但是非同步回撥的話,就原始碼報錯,應該是庫本身的bug,這個不好解決,如果堅持要有非同步呼叫dll封裝的方法,我們最終是用別的方式實現。
最後附上另外幾個,我測試ffi版本的結果。
node降至10.*的版本,electron降至5.*是可以使用node-ffi這個本身庫的,並且能使用c++的回撥,但我專案裡沒法降這個版本,因為我專案比較複雜,還有本地sqlite、分詞庫其他的node庫,降低node版本這些庫就rebuild不通過了。
node版本12*的話,只能安裝ffi對應12*的分支,傳送門,package.json裡修改如下,這個也是沒法用c++回撥,其他功能ok。
"ffi": "github:lxe/node-ffi#node-12", "ref": "github:lxe/ref#node-12", "ref-array": "github:lxe/ref-array#node-12", "ref-struct": "github:lxe/ref-struct#node-12"複製程式碼