欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Rust在Android端集成使用詳解

 更新時間:2024年11月05日 10:02:07   作者:良技漫談  
本文介紹了如何在Android平臺上調(diào)用Rust編寫的組件,詳細(xì)說明了開發(fā)環(huán)境的搭建、Rust庫的創(chuàng)建、配置和編譯過程,以及如何在Android應(yīng)用中使用Rust編寫的代碼,文中提到飛書底層使用Rust編寫通用組件,展示了Rust在移動端開發(fā)中的應(yīng)用價(jià)值

Andorid調(diào)用Rust

  • 目前Rust在移動端上的應(yīng)用,一般作為應(yīng)用sdk的提供,供各端使用,目前飛書底層使用Rust編寫通用組件。
  • 該篇適合對Android、Rust了解,想看如何做整合,如果想要工程源碼,可以評論或留言有解疑也可進(jìn)行詢問(更多最新文章也可關(guān)注微信公號:良技漫談)

一.開發(fā)環(huán)境:

  •  確保rust開發(fā)環(huán)境,推薦官方文檔, 安裝即可
  •  Android相關(guān)開發(fā)環(huán)境,需要NDK的下載安裝
  •  環(huán)境變量的配置,為命令行使用提供全局環(huán)境

開發(fā)工具:

1. 如果對android studio比較熟悉,可安裝rust插件 

安裝完畢,對Rust Toolchain 位置進(jìn)行配置確認(rèn),否則可能對rs文件無法識別,就無法愉快使用studio編寫rust

2. 推薦使用VSCode編寫rust代碼,可以去下載 Visual Studio Code,然后安裝rust相關(guān)插件即可。

二.創(chuàng)建Android工程:

• 如果對Android比較熟悉,使用studio來創(chuàng)建工程,和其他Android工程創(chuàng)建一樣,創(chuàng)建Empty Activity,工程名 AndroidIntegratingRust

先編譯通過該空工程,確保依賴資源下載完整。

三,添加rust lib庫:

進(jìn)入到剛創(chuàng)建的AndroidIntegratingRust工程下

1.使用rust Cargo創(chuàng)建 lib庫:

Cargo new rust_lib --lib

• 創(chuàng)建成功后會有rust_lib庫,結(jié)構(gòu)如下:

├── app
│   ├── build
│   ├── build.gradle
│   ├── libs
│   ├── proguard-rules.pro
│   └── src
├── build
│   └── kotlin
├── build.gradle
├── gradle
│   └── wrapper
├── gradle.properties
├── gradlew
├── gradlew.bat
├── local.properties
├── rust_lib //位置在這
│   ├── Cargo.lock
│   ├── Cargo.toml
│   ├── src
│   └── target
└── settings.gradle

2.編輯Cargo.toml

輸入目前需要的jni庫依賴, https://crates.io/地址下確認(rèn)版本, create-type 填寫cdylib 動態(tài)鏈接庫

[lib]
name = "rust_lib"
crate-type = ["cdylib"]
[dependencies]
jni = "0.20.0"  

3.配置要編譯so的linker及target

  • 這個在rust_lib下創(chuàng)建.cargo目錄,添加config.toml配置文件
  • 填入linker對應(yīng)的ndk地址:
[target.aarch64-linux-android]
linker = "/Users/android-sdk-macosx/ndk-bundle/toolchains/llvm/prebuilt/darwin-x86_64/bin/aarch64-linux-android21-clang++"
[target.armv7-linux-androideabi]
linker = "/Users/android-sdk-macosx/ndk-bundle/toolchains/llvm/prebuilt/darwin-x86_64/bin/armv7a-linux-androideabi21-clang++"

ps: 這是我的mac上ndk所在位置,參考Android官方ndk文檔。

 準(zhǔn)備編譯rust代碼為so的環(huán)境已經(jīng)準(zhǔn)備完

四,編寫Android和Rust代碼:

創(chuàng)建Android代碼, RustGreetings類, 使用kotlin所以用external聲明JNI函數(shù)

class RustGreetings {
    fun sayHello(to: String): String {
        return greeting(to)
    }
    companion object {
        @JvmStatic external fun greeting(pattern: String): String
    }
}

在Rust lib庫下,編寫對應(yīng)的JNI函數(shù)映射,從create.io下可以看到有關(guān)JNI的使用,代碼如下

use jni::JNIEnv;
// These objects are what you should use as arguments to your native
// function. They carry extra lifetime information to prevent them escaping
// this context and getting used after being GC'd.
use jni::objects::{JClass, JString};
// This is just a pointer. We'll be returning it from our function. We
// can't return one of the objects with lifetime information because the
// lifetime checker won't let us.
use jni::sys::jstring;
// This keeps Rust from "mangling" the name and making it unique for this
// crate.
#[no_mangle]
pub extern "system" fn Java_com_android_integratingrust_RustGreetings_greeting(
    env: JNIEnv,
    // This is the class that owns our static method. It's not going to be used,
    // but still must be present to match the expected signature of a static
    // native method.
    class: JClass,
    input: JString,
) -> jstring {
    // First, we have to get the string out of Java. Check out the `strings`
    // module for more info on how this works.
    let mut input: String = env
        .get_string(input)
        .expect("Couldn't get java string!")
        .into();
    input = append_string(&input);
    // Then we have to create a new Java string to return. Again, more info
    // in the `strings` module.
    let output = env
        .new_string(format!("Hello, {}!", input))
        .expect("Couldn't create java string!");
    // Finally, extract the raw pointer to return.
    output.into_raw()
}
//============== rust code ===============
fn append_string(value: &str) -> String {
    let mut origin = String::from(value);
    origin.push_str("this is Rust");
    return origin;
}
 

五,編譯Rust代碼為so

  • 編譯之前確認(rèn)之前rust環(huán)境是可以使用的了,且要看下rustup target 下是否已經(jīng)有要交叉編譯的工具了。
  •  rustc --print target-list | grep android 可以查看相關(guān)android 交叉編譯工具,(我們demo之前在配置target時,使用了32和64位的ARM CPU 架構(gòu)linker)
aarch64-linux-android
arm-linux-androideabi
armv7-linux-androideabi
i686-linux-android
thumbv7neon-linux-androideabi
x86_64-linux-android

 如果沒有安裝,需要安裝下對應(yīng)的

rustup target add aarch64-linux-android armv7-linux-androideabi
  •  rustup show 可以看到當(dāng)前rust開發(fā)語言環(huán)境,包括 (installed targets for active toolchain)
  •  rustup target list可以查看到那些已經(jīng)安裝和rust支持的。

執(zhí)行編譯

到rust_lib目錄下執(zhí)行編譯

cargo build --target aarch64-linux-android --release

 編譯成功到target目錄下release下去查看對應(yīng)的so文件

.
├── CACHEDIR.TAG
├── aarch64-linux-android
│   ├── CACHEDIR.TAG
│   └── release
├── armv7-linux-androideabi
│   ├── CACHEDIR.TAG
│   └── release
├── debug
│   ├── build
│   ├── deps
│   ├── examples
│   └── incremental
└── release
    ├── build
    ├── deps
    ├── examples
    └── incremental

六,使用rust代碼運(yùn)行工程

    sourceSets {
        main {
            jniLibs.srcDirs = ['src/main/libs']
        }
    }
  •  copy 對應(yīng)的so文件到 Android工程下src/main/libs下
  •  在Android工程下build.gradle下記得引用so為jniLibs

到此這篇關(guān)于Rust在Android端集成使用介紹的文章就介紹到這了,更多相關(guān)Rust Android集成使用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 最新Rust錯誤處理簡介

    最新Rust錯誤處理簡介

    Rust并不像C++一樣使用try?catch的異常機(jī)制來進(jìn)行錯誤處理,他將錯誤分為可恢復(fù)錯誤和不可恢復(fù)錯誤兩類,主要使用panic!宏和Result<T,E>類型來進(jìn)行錯誤處理,這篇文章主要介紹了Rust錯誤處理簡介,需要的朋友可以參考下
    2022-11-11
  • Rust中的宏之聲明宏和過程宏詳解

    Rust中的宏之聲明宏和過程宏詳解

    Rust中的宏是一種強(qiáng)大的工具,可以幫助開發(fā)人員編寫可重用、高效和靈活的代碼,這篇文章主要介紹了Rust中的宏:聲明宏和過程宏,需要的朋友可以參考下
    2023-04-04
  • rust 如何使用 cargo-nextest 替代 cargo test

    rust 如何使用 cargo-nextest 替代 cargo te

    cargo-nextest 是新一代的rust測試程序,能夠極大提升測試性能,可以完全替代 cargo test 命令,這篇文章主要介紹了rust 如何使用 cargo-nextest 替代 cargo test,需要的朋友可以參考下
    2024-05-05
  • Rust實(shí)現(xiàn)冒泡排序算法示例詳解

    Rust實(shí)現(xiàn)冒泡排序算法示例詳解

    這篇文章主要為大家介紹了Rust實(shí)現(xiàn)冒泡排序算法示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-08-08
  • rust?zip異步壓縮與解壓的代碼詳解

    rust?zip異步壓縮與解壓的代碼詳解

    在使用actix-web框架的時候,如果使用zip解壓任務(wù)將會占用一個工作線程,因?yàn)閦ip庫是同步阻塞的,想用異步非阻塞需要用另一個庫,下面介紹下rust?zip異步壓縮與解壓的示例,感興趣的朋友一起看看吧
    2024-04-04
  • Rust?編程語言中的所有權(quán)ownership詳解

    Rust?編程語言中的所有權(quán)ownership詳解

    這篇文章主要介紹了Rust?編程語言中的所有權(quán)ownership詳解的相關(guān)資料,需要的朋友可以參考下
    2023-02-02
  • Rust的泛型、Traits與生命周期用法及說明

    Rust的泛型、Traits與生命周期用法及說明

    本文通過一個尋找列表中最大值的示例,展示了如何從重復(fù)代碼中提取函數(shù),再利用泛型實(shí)現(xiàn)代碼復(fù)用,主要步驟包括:識別重復(fù)邏輯;抽象提??;泛型應(yīng)用;進(jìn)一步擴(kuò)展,通過不斷抽象和泛化,我們不僅能減少代碼重復(fù),還能寫出更通用、健壯和可維護(hù)的代碼
    2025-02-02
  • rust智能指針的具體使用

    rust智能指針的具體使用

    智能指針是一些數(shù)據(jù)結(jié)構(gòu),它們的行為類似于指針但擁有額外的元數(shù)據(jù)和附加功能,本文就來介紹一下rust智能指針的具體使用,感興趣的可以了解一下
    2023-12-12
  • Rust 累計(jì)時間長度的操作方法

    Rust 累計(jì)時間長度的操作方法

    在Rust中,如果你想要記錄累計(jì)時間,通??梢允褂脴?biāo)準(zhǔn)庫中的std::time::Duration類型,這篇文章主要介紹了Rust如何累計(jì)時間長度,需要的朋友可以參考下
    2024-05-05
  • Rust中的注釋使用解讀

    Rust中的注釋使用解讀

    本文介紹了Rust中的行注釋、塊注釋和文檔注釋的使用方法,通過示例展示了如何在實(shí)際代碼中應(yīng)用這些注釋,以提高代碼的可讀性和可維護(hù)性
    2025-02-02

最新評論