摘要:前言在上一篇文章使用開發跨平臺桌面應用一中,我們將結合起來,使用編寫核心業務邏輯,并編譯成庫提供給的界面調用,但是在上一篇文章中發現遇到了很多問題,尤其是的版本和編譯出來的版本必須要一致,否則會無法調用成功,這就很坑了,所以為了改變這一情況
前言
在上一篇文章使用Rust + Electron開發跨平臺桌面應用 ( 一 )中,我們將Rust + Electron結合起來,使用Rust編寫核心業務邏輯,并編譯成node庫提供給Electron的UI界面調用,但是在上一篇文章中發現遇到了很多問題,尤其是Electron 的版本和 Rust編譯出來的版本必須要一致,否則會無法調用成功,這就很坑了,所以為了改變這一情況,今天我們將使用另一種方式將Rust的代碼提供給Js進行調用,這就是FFI。
FFI是什么FFI(Foreign Function Interface)是用來與其它語言交互的接口,由于現實中很多程序是由不同編程語言寫的,必然會涉及到跨語言調用,這時一般有兩種解決方案:
1、將函數做成一個服務,通過進程間通信(IPC)或網絡協議通信(RPC, RESTful等);
2、直接通過 FFI 調用。
前者需要至少兩個獨立的進程才能實現,而后者直接將其它語言的接口內嵌到本語言中,所以調用效率比前者高。
Rust作為系統級編程語言,也是對FFI提供了完善的支持。
mangle由于rust支持重載,所以函數名會被編譯器進行混淆,就像c++一樣。因此當你的函數被編譯完畢后,函數名會帶上一串表明函數簽名的字符串。
這樣的函數名為ffi調用帶來了困難,因此,rust提供了#[no_mangle]屬性為函數修飾。 對于帶有#[no_mangle]屬性的函數,rust編譯器不會為它進行函數名混淆, 如:
#[no_mangle] pub extern fn test() {}
下面我們來編寫一個thread_count.rs,其實跟尋常的rust代碼沒有什么區別:
#[no_mangle] pub extern fn threadcount(x: i32) -> i32 { let result: i32 = num_cpus::get() as i32; return result * x; }指定庫類型
rust默認編譯成rust自用的rlib格式庫,要讓rust編譯成動態鏈接庫或者靜態鏈接庫,需要顯示指定,一共有三種方式,我這里采用的是直接在Cargo.Toml文件中指定,如下:
[lib] name = "thread_count" crate-type = ["dylib"]
需要注意的是name,必須符合rust的包結構,能夠在src目錄下找到。
我們執行cargo build命令,可以看到,在/target/debug目錄下生成了我們需要的文件libthread_count.dylib
JS使用rust的動態鏈接庫那么我們要如何在JS中調用rust生成dylib呢?答案就是ffi-napi,我們使用ffi-napi這個包來在js中調用ffi,話不多說,直接看代碼
let ffi = require("ffi-napi"); let path = require("path"); let threadCount = ffi.Library(path.join(__dirname, "./target/debug/libthread_count"), { threadcount: ["int", ["int"]] }); let result = threadCount.threadcount(12); console.log("thead_count: " + result);
結果如下:
好了,到此為止,我們就成功的將rust編譯成動態鏈接庫給JS調用了,這種方式是我覺得比較好的一種方式,雖然引入函數的方式比較丑,但是我們不用擔心node版本的問題。
結語雖然FFI是一種我認為比較好的方式,但是它也不是完美無缺的,例如,在跨越FFI的過程中,我們會丟失rust的類型信息,從而引發安全性問題,當然這也不是沒有解決辦法,我們可以使用rust的Box來包裝我們的類型,這個可以多帶帶開一篇文章來講述,就不展開了(先挖個坑,哪天想起來再填)
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/101475.html
摘要:所以我們需要將打包成模塊提供給進行調用。安裝完之后我們執行,新建一個項目。需要注意的是編譯的版本需要與運行的版本一致,否則會出現無法調用的情況。 前言 近段時間學習了Rust,一直想著做點什么東西深入學習,因為是剛學習,很多地方都不熟悉,所以也就不能拿它來做編譯器這些,至于web開發,實際上我并不建議拿這個來學習一門語言,大概有幾個方面,一是web開發的套路無非也就那么幾個,對學習一門...
摘要:楊冀龍是安全焦點民間白帽黑客組織核心成員,被浪潮之巔評為中國新一代黑客領軍人物之一他在本文中依次分享了對于黑客的定義如何從黑客成為一名安全創業者技術創業踩過的坑給技術創業者建議等內容。 showImg(https://segmentfault.com/img/remote/1460000012377230?w=1240&h=796); 前端每周清單專注前端領域內容,以對外文資料的搜集為...
摘要:導讀使用開發客戶端程序已經有一段時間了,整體感覺還是非常不錯的,其中也遇到了一些坑點,本文是從運行原理到實際應用對進行一次系統性的總結。一桌面應用程序桌面應用程序,又稱為程序,但是和程序也有一些區別。就開發速度方面,比原生編譯技術要快一些。 導讀 使用Electron開發客戶端程序已經有一段時間了,整體感覺還是非常不錯的,其中也遇到了一些坑點,本文是從【運行原理】到【實際應用】對Ele...
摘要:是一款幫助開發者實現跨平臺桌面開發的平臺。開發者只需要使用即可開發屬于自己的桌面應用。下面我來介紹下自己開發的一個小的應用,主要用來簡化進入終端的步驟。增加的時候彈框選擇一個想要打開的應用,可以添加自己的命令,比如甚至啟動之類的。 electron 是一款幫助開發者實現跨平臺桌面開發的平臺。開發者只需要使用javascript html css即可開發屬于自己的桌面應用。 所以說假如你...
閱讀 2060·2021-11-23 09:51
閱讀 3353·2021-09-28 09:36
閱讀 1120·2021-09-08 09:35
閱讀 1758·2021-07-23 10:23
閱讀 3258·2019-08-30 15:54
閱讀 2998·2019-08-29 17:05
閱讀 438·2019-08-29 13:23
閱讀 1294·2019-08-28 17:51