Rust在Android端的入门开发(rust android开发)

IOS上应用还在半路上,遇到了一些集成问题。在了解、学习过程中发现,IOSSwifit UI动画真的是比Flutter做的好几倍,后面有时间可以记录记录。本次先记录Android集成吧,对比性能的话,可以在rustfor循环个10万次,对比C的时间消耗。
参考资料
Building and Deploying a Rust library on Android
JNI Create
Create JNI

目录

Rust在Android端的入门开发(rust android开发)

一、环境准备

rustup配置

这个配置,在装rust的时候就配置了,可以忽略。如果没有配置,想了解的可以看二、Rust入门之Hello World

配置NDK

第一步
先确定自己的NDK目录
默认目录一般都在
/Users/你的用户名/Library/Android/sdk/ndk-bundle 这个位置,用户目录可以用 ${HOME} 代替。

第二步
创建库
crate

cargo new android_demo --lib

第三步
切换到 android_demo 项目下,创建 NDK 文件
找到 make_standalone_toolchain.py 文件,执行以下语句

python D:/Android/SDK/ndk-bundle/build/tools/make_standalone_toolchain.py --api 26 --arch arm64 --install-dir NDK/arm64python D:/Android/SDK/ndk-bundle/build/tools/make_standalone_toolchain.py --api 26 --arch arm --install-dir NDK/armpython D:/Android/SDK/ndk-bundle/build/tools/make_standalone_toolchain.py --api 26 --arch x86 --install-dir NDK/x86

对应的NDK目录如下

Rust在Android端的入门开发(rust android开发)

第四步
找到 cargo的配置文件,~/.cargo/config

[target.aarch64-linux-android]ar = "E:/VSCodeWorkspace/rust/android_demo/NDK/arm64/bin/aarch64-linux-android-ar"linker = "E:/VSCodeWorkspace/rust/android_demo/NDK/arm64/bin/aarch64-linux-android-clang"[target.armv7-linux-androideabi]ar = "E:/VSCodeWorkspace/rust/android_demo/NDK/arm/bin/arm-linux-androideabi-ar"linker = "E:/VSCodeWorkspace/rust/android_demo/NDK/arm/bin/arm-linux-androideabi-clang"[target.i686-linux-android]ar = "E:/VSCodeWorkspace/rust/android_demo/NDK/x86/bin/i686-linux-android-ar"linker = "E:/VSCodeWorkspace/rust/android_demo/NDK/x86/bin/i686-linux-android-clang"

其中 E:/VSCodeWorkspace/rust/android_demo 是本次项目目录。

第五步
添加工具链

rustup target add aarch64-linux-android armv7-linux-androideabi i686-linux-android

第六步
在当前 android_demo 目录下,执行以下语句
编译Rust项目,按需要的架构编译即可。

cargo build --target aarch64-linux-android --releasecargo build --target armv7-linux-androideabi --releasecargo build --target i686-linux-android --release

  • 出现问题note: %1 不是有效的 Win32 应用程序。 (os error 193) ,第三步和第六步编译不一致。解决方法:将第四步,换成Android SDK 目录下的ndk,看下面代码示例。error: linker cc not found,解决方案也是按照下面,一定要使用 .cmd

解决方案

[target.aarch64-linux-android]ar = "D:AndroidSDKndk21.4.7075529toolchainsllvmprebuiltwindows-x86_64binaarch64-linux-android-ar"linker = "D:AndroidSDKndk21.4.7075529toolchainsllvmprebuiltwindows-x86_64binaarch64-linux-android26-clang.cmd"[target.armv7-linux-androideabi]ar = "D:AndroidSDKndk21.4.7075529toolchainsllvmprebuiltwindows-x86_64binarm-linux-androideabi-ar"linker = "D:AndroidSDKndk21.4.7075529toolchainsllvmprebuiltwindows-x86_64binarmv7a-linux-androideabi26-clang .cmd"xxx

产物

Rust在Android端的入门开发(rust android开发)

二、Rust实现

Cargo.toml

[package]name = "android_demo"version = "0.1.0"edition = "2021"# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html[dependencies]jni-sys = "0.3.0"[target.'cfg(target_os="android")'.dependencies]jni = { version = "0.5", default-features = false }[lib]crate-type = ["dylib"]

lib.rs

/* * @Author: axiong */use std::os::raw::{c_char};use std::ffi::{CString, CStr};#[no_mangle]pub extern fn rust_greeting(to: *const c_char) -> *mut c_char { let c_str = unsafe { CStr::from_ptr(to) }; let recipient = match c_str.to_str() { Err(_) => "there", Ok(string) => string, }; CString::new("Hello ".to_owned() recipient).unwrap().into_raw()}/// Expose the JNI interface for android below/// 只有在目标平台是Android的时候才开启 [cfg(target_os="android")/// 由于JNI要求驼峰命名,所以要开启 allow(non_snake_case)#[cfg(target_os="android")]#[allow(non_snake_case)]pub mod android { extern crate jni; use super::*; use self::jni::JNIEnv; use self::jni::objects::{JClass, JString}; use self::jni::sys::{jstring}; #[no_mangle] pub unsafe extern fn Java_com_rjx_rustdemo_RustGreeting_greeting(env: JNIEnv, _: JClass, java_pattern: JString) -> jstring { // Our Java companion code might pass-in "world" as a string, hence the name. let world = rust_greeting(env.get_string(java_pattern).expect("invalid pattern string").as_ptr()); // Retake pointer so that we can use it below and allow memory to be freed when it goes out of scope. let world_ptr = CString::from_raw(world); let output = env.new_string(world_ptr.to_str().unwrap()).expect("Couldn't create java string!"); output.into_inner() }}

三、Android集成

SO集成

Rust在Android端的入门开发(rust android开发)

RustGreeting.java

public class RustGreeting { static { System.loadLibrary("android_demo"); } private static native String greeting(final String pattern); public static String sayHello(String to) { return greeting(to); }}

MainActivity.java

public class MainActivity extends AppCompatActivity { // Used to load the 'native-lib' library on application startup. static { //System.loadLibrary("native-lib"); } private ActivityMainBinding binding; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = ActivityMainBinding.inflate(getLayoutInflater()); setContentView(binding.getRoot()); // Example of a call to a native method TextView tv = binding.sampleText; tv.setText(RustGreeting.sayHello("Rust!!")); }}

效果

Rust在Android端的入门开发(rust android开发)

作者:CodeOver
链接:https://juejin.cn/post/7170696817682694152
来源:稀土掘金

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

(0)
上一篇 2023年5月14日 上午11:03
下一篇 2023年5月14日 上午11:19

相关推荐

  • 爷青结!腾讯WiFi管家宣布凉凉 但完全在意料之内

    【CNMO】很多电子产品都离不开WiFi,自2010年以来,无线网络的覆盖范围在国内越来越广泛,机尝车站、咖啡店、图书馆等区域都有WiFi接口,但往往都需要验证码。这时,一大批Wi…

    科研百科 2022年11月28日
    358
  • 本单位该学科领域的现有基础

    本单位该学科领域的现有基础 本单位是某大学某学科的教授团队,该学科领域涉及多个学科,包括数学,物理,化学,生物等。我们的现有基础包括多年的研究经验,大量的文献资料,以及一支优秀的团…

    科研百科 2024年11月9日
    0
  • #故事

    学校把我开除龙科院急了。 导师污蔑我飘窃转头,跪舔系主任的女儿。我怒了替考整蛊副校长,院士选举坑导师气的校长让我滚。直到一份研究报告轰动龙科院,院长亲自来学校请人,望着冷汗淋漓的校…

    科研百科 2024年4月11日
    152
  • 一站式会议管理系统

    一站式会议管理系统: 提高会议效率,优化会议管理 随着现代职场的不断发展,越来越多的公司和组织开始重视会议管理的重要性。一个好的会议管理系统可以大大提高会议的效率,并帮助组织更好地…

    科研百科 2025年1月2日
    0
  • 奥维地图怎么在电脑端导入kml文件

    奥维地图是一款功能强大的地图应用,它提供了丰富的地图样式和功能,并且可以与多种数据源进行集成。KML(Keyhole Markup Language)是一种用于描述地理特征的XML…

    科研百科 2024年10月25日
    7
  • 科研保密管理

    科研保密管理是保证科研活动秘密性、安全性和可控性的重要措施。科研保密管理不仅仅是对研究成果和知识产权的保护,更是对研究人员信息和人格尊严的尊重。本文将从科研保密管理的重要性、管理流…

    科研百科 2024年10月11日
    11
  • 中国矿业大学(北京)科研院(中国矿业大学北京重大科研项目)

    中国矿业大学北京重大科研项目 中国矿业大学是北京的一家著名高等教育机构,拥有丰富的教学和科研资源。近年来,中国矿业大学在科研领域取得了重大进展,尤其是在北京校区,有许多引人注目的科…

    科研百科 2024年8月2日
    72
  • 插上科技翅膀 放飞科学梦想 ——庆城县科技馆工作综述(县科技馆活动)

    科学技术是第一生产力,人才是第一资源,具备高素质科学素养的广大青少年学生是实现科技强国,推动中国式现代化的后备力量。为培养更多的熟练掌握各领域科学知识、拓宽创新创造思维的青年才俊,…

    科研百科 2024年4月21日
    98
  • 西北工业大学欧立雄教授:管控项目审批进程,从源头上把握项目

    9月12日-13日,法国诺曼底企业家专业硕士学位班特邀西北工业大学管理学院教授、国际项目管理研究院副院长——欧立雄,带来《项目管理》主题课程。 欧教授基于企业管理的视角,结合真实具…

    科研百科 2022年6月18日
    337
  • 医院2024年上半年党建工作总结范文提纲(2021年上半年医院党建工作总结)

    医院2024年上半年党建工作总结范文提纲 ……现将今年上半年来党建工作开展情况简要汇报如下: 一、工作开展情况 (一)党建引领全局,夯实基层党建工作基础。 (二)党建引领思想,牢抓…

    科研百科 2024年6月27日
    423