成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

使用Rust + Electron開發(fā)跨平臺桌面應用 ( 二 )

forrest23 / 3691人閱讀

摘要:前言在上一篇文章使用開發(fā)跨平臺桌面應用一中,我們將結(jié)合起來,使用編寫核心業(yè)務邏輯,并編譯成庫提供給的界面調(diào)用,但是在上一篇文章中發(fā)現(xiàn)遇到了很多問題,尤其是的版本和編譯出來的版本必須要一致,否則會無法調(diào)用成功,這就很坑了,所以為了改變這一情況

前言

在上一篇文章使用Rust + Electron開發(fā)跨平臺桌面應用 ( 一 )中,我們將Rust + Electron結(jié)合起來,使用Rust編寫核心業(yè)務邏輯,并編譯成node庫提供給Electron的UI界面調(diào)用,但是在上一篇文章中發(fā)現(xiàn)遇到了很多問題,尤其是Electron 的版本和 Rust編譯出來的版本必須要一致,否則會無法調(diào)用成功,這就很坑了,所以為了改變這一情況,今天我們將使用另一種方式將Rust的代碼提供給Js進行調(diào)用,這就是FFI。

FFI是什么

FFI(Foreign Function Interface)是用來與其它語言交互的接口,由于現(xiàn)實中很多程序是由不同編程語言寫的,必然會涉及到跨語言調(diào)用,這時一般有兩種解決方案:

1、將函數(shù)做成一個服務,通過進程間通信(IPC)或網(wǎng)絡協(xié)議通信(RPC, RESTful等);

2、直接通過 FFI 調(diào)用。

前者需要至少兩個獨立的進程才能實現(xiàn),而后者直接將其它語言的接口內(nèi)嵌到本語言中,所以調(diào)用效率比前者高。

Rust作為系統(tǒng)級編程語言,也是對FFI提供了完善的支持。

mangle

由于rust支持重載,所以函數(shù)名會被編譯器進行混淆,就像c++一樣。因此當你的函數(shù)被編譯完畢后,函數(shù)名會帶上一串表明函數(shù)簽名的字符串。
這樣的函數(shù)名為ffi調(diào)用帶來了困難,因此,rust提供了#[no_mangle]屬性為函數(shù)修飾。 對于帶有#[no_mangle]屬性的函數(shù),rust編譯器不會為它進行函數(shù)名混淆, 如:

#[no_mangle]
pub extern fn test() {}

下面我們來編寫一個thread_count.rs,其實跟尋常的rust代碼沒有什么區(qū)別:

#[no_mangle]
pub extern fn threadcount(x: i32) -> i32 {
    let result: i32 = num_cpus::get() as i32;
    return result * x;
}
指定庫類型

rust默認編譯成rust自用的rlib格式庫,要讓rust編譯成動態(tài)鏈接庫或者靜態(tài)鏈接庫,需要顯示指定,一共有三種方式,我這里采用的是直接在Cargo.Toml文件中指定,如下:

[lib]
name = "thread_count"
crate-type = ["dylib"]

需要注意的是name,必須符合rust的包結(jié)構(gòu),能夠在src目錄下找到。

我們執(zhí)行cargo build命令,可以看到,在/target/debug目錄下生成了我們需要的文件libthread_count.dylib

JS使用rust的動態(tài)鏈接庫

那么我們要如何在JS中調(diào)用rust生成dylib呢?答案就是ffi-napi,我們使用ffi-napi這個包來在js中調(diào)用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);

結(jié)果如下:

好了,到此為止,我們就成功的將rust編譯成動態(tài)鏈接庫給JS調(diào)用了,這種方式是我覺得比較好的一種方式,雖然引入函數(shù)的方式比較丑,但是我們不用擔心node版本的問題。

結(jié)語

雖然FFI是一種我認為比較好的方式,但是它也不是完美無缺的,例如,在跨越FFI的過程中,我們會丟失rust的類型信息,從而引發(fā)安全性問題,當然這也不是沒有解決辦法,我們可以使用rust的Box來包裝我們的類型,這個可以多帶帶開一篇文章來講述,就不展開了(先挖個坑,哪天想起來再填)

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/101475.html

相關(guān)文章

  • 使用Rust + Electron開發(fā)平臺桌面應用 ( 一 )

    摘要:所以我們需要將打包成模塊提供給進行調(diào)用。安裝完之后我們執(zhí)行,新建一個項目。需要注意的是編譯的版本需要與運行的版本一致,否則會出現(xiàn)無法調(diào)用的情況。 前言 近段時間學習了Rust,一直想著做點什么東西深入學習,因為是剛學習,很多地方都不熟悉,所以也就不能拿它來做編譯器這些,至于web開發(fā),實際上我并不建議拿這個來學習一門語言,大概有幾個方面,一是web開發(fā)的套路無非也就那么幾個,對學習一門...

    DrizzleX 評論0 收藏0
  • 前端每周清單第 43 期:2017 JavaScript 回顧、Rust 與 WebAssembly

    摘要:楊冀龍是安全焦點民間白帽黑客組織核心成員,被浪潮之巔評為中國新一代黑客領(lǐng)軍人物之一他在本文中依次分享了對于黑客的定義如何從黑客成為一名安全創(chuàng)業(yè)者技術(shù)創(chuàng)業(yè)踩過的坑給技術(shù)創(chuàng)業(yè)者建議等內(nèi)容。 showImg(https://segmentfault.com/img/remote/1460000012377230?w=1240&h=796); 前端每周清單專注前端領(lǐng)域內(nèi)容,以對外文資料的搜集為...

    xorpay 評論0 收藏0
  • 用JS開發(fā)平臺桌面應用,從原理到實踐

    摘要:導讀使用開發(fā)客戶端程序已經(jīng)有一段時間了,整體感覺還是非常不錯的,其中也遇到了一些坑點,本文是從運行原理到實際應用對進行一次系統(tǒng)性的總結(jié)。一桌面應用程序桌面應用程序,又稱為程序,但是和程序也有一些區(qū)別。就開發(fā)速度方面,比原生編譯技術(shù)要快一些。 導讀 使用Electron開發(fā)客戶端程序已經(jīng)有一段時間了,整體感覺還是非常不錯的,其中也遇到了一些坑點,本文是從【運行原理】到【實際應用】對Ele...

    mj 評論0 收藏0
  • 使用Electron 構(gòu)建是自己的桌面快捷應用

    摘要:是一款幫助開發(fā)者實現(xiàn)跨平臺桌面開發(fā)的平臺。開發(fā)者只需要使用即可開發(fā)屬于自己的桌面應用。下面我來介紹下自己開發(fā)的一個小的應用,主要用來簡化進入終端的步驟。增加的時候彈框選擇一個想要打開的應用,可以添加自己的命令,比如甚至啟動之類的。 electron 是一款幫助開發(fā)者實現(xiàn)跨平臺桌面開發(fā)的平臺。開發(fā)者只需要使用javascript html css即可開發(fā)屬于自己的桌面應用。 所以說假如你...

    Gilbertat 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<