Android Rust JNI系列教程(一) 环境配置

news/2024/11/17 20:31:05/

本系列文章将从rust环境搭建开始,逐步带大家了解使用rust进行Android JNI开发的基本技能.相关文章共分为如下几步:

  1. Rust JNI环境搭建.
  2. 创建第一个Rust JNI项目
  3. RustAndroid互相调用
  4. Rust 调用Android API 实现签名验证
  5. Rust 使用openssl 实现Android签名验证

每一章文末都会稍带一些扩展知识,大家了解即可,真正需要时再去细究.

安装

Linux或者mac上安装rust

一行命令

curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

如果你使用的是Windows系统,可以参考https://www.rust-lang.org/tools/installhttps://course.rs/first-try/installation.html

验证rust是否安装成功

  1. 验证rustc,命令行输入:
rustc --version  

安装成功的话会有如下输出:

rustc 1.65.0 (897e37553 2022-11-02)

其中1.65.0 (897e37553 2022-11-02)为版本号,读者们不必追求版本号与文章一致,以本地的版本号为准.

  1. 验证cargo,命令行输入:
cargo --version 

输出如下:

cargo 1.65.0 (4bc8f24d3 2022-10-20)

同样,1.65.0 (4bc8f24d3 2022-10-20)只是版本号,不必追求与文章一致.

交叉编译环境

  1. rust 安装交叉编译组件,其中:

aarch64-linux-android 对应 arm64-v8a
armv7-linux-androideabi 对应 armeabi-v7a
我们以aarch64-linux-android 为例,安装命令如下:

rustup target add aarch64-linux-android 
  1. 验证

安装完成后,使用以下命令进行验证:

rustup target list

获取输出如下:

aarch64-apple-darwin
aarch64-apple-ios
aarch64-apple-ios-sim
aarch64-fuchsia
aarch64-linux-android (installed)
aarch64-pc-windows-msvc
aarch64-unknown-linux-gnu
aarch64-unknown-linux-musl
aarch64-unknown-none
aarch64-unknown-none-softfloat
arm-linux-androideabi
arm-unknown-linux-gnueabi
arm-unknown-linux-gnueabihf
arm-unknown-linux-musleabi
...

其中aarch64-linux-android (installed),代表我们已经安装好aarch64-linux-android组件了.
同时我们也可以看到,rust交叉编译所支持的平台非常多,更加完整的介绍可见https://doc.rust-lang.org/nightly/rustc/platform-support.html.

  1. 配置config文件
  • ~/.cargo文件夹下,查看是否存在名为config的文件,不存在的话直接创建即可.
  • 编辑config文件,内容如下:
[target.aarch64-linux-android]
ar = "<path>/NDK/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android-ar"
linker = "<path>/NDK/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android30-clang"

另请注意,rust官方关于配置ndk的文档已经很久没更新过了,仅供参考https://mozilla.github.io/firefox-browser-architecture/experiments/2017-09-21-rust-on-android.html. 文中所说${NDK_HOME}/build/tools/make_standalone_toolchain.py --api 26 --arch arm64 --install-dir NDK/arm64 这部分操作已经不再需要了.在我的NDK版本22.1.7171670下已经内置了aarch64-linux-android-araarch64-linux-android30-clang,不再需要重新编译.

扩展知识(了解即可,等到真正需要的时候再去研究)

cross (https://github.com/cross-rs/cross)

“Zero setup” cross compilation and “cross testing” of Rust crates

cross这个工具会让交叉编译更简单,简单理解就是cross在容器里已经配置好了NDK等环境,我们只管开发完代码之后执行 cross build --target aarch64-linux-android --release就可编译出android对应的arm64-v8aso文件了,不再需要在本机上再手动配置NDKconfig文件.笔者本机环境Ubuntu 22.04使用cross编译android平台的so文件,x86_64Windows可执行文件以及mips的路由器端可执行文件,使用起来很方便.

结语

本章结束后,本机环境信息如下

$ rustc --version                                                          
rustc 1.65.0 (897e37553 2022-11-02)
$ cargo --version                                                      
cargo 1.65.0 (4bc8f24d3 2022-10-20)

NDK: 22.1.7171670

交叉编译组件:aarch64-linux-android
我们将在此环境下开始接下来的rust-jni的学习.

Android项目地址:https://github.com/tangxuesong6/Android_Rust_JNI_Demo
rust项目地址:https://github.com/tangxuesong6/Rust_JNI_Demo


http://www.ppmy.cn/news/3849.html

相关文章

深度剖析 | 【JVM深层系列】[HotSpotVM研究系列] JVM调优的“标准参数“的各种陷阱和坑点分析(攻克盲点及混淆点)「 1 」

【易错问题】Major GC和Full GC的区别是什么&#xff1f;触发条件呢&#xff1f; 相信大多数人的理解是Major GC只针对老年代&#xff0c;Full GC会先触发一次Minor GC&#xff0c;不知对否&#xff1f;我参考了R大的分析和介绍&#xff0c;总结了一下相关的说明和分析结论。 …

通过GDB调试内核与模块

目录说明vlinux内核文档中的调试说明vlinux/Documentation/gdb-kernel-debugging.txtRequirementsSetup1. Create a virtual Linux machine for QEMU/KVM2. Enable the gdb stub of QEMU/KVM, either3. Attach to the booted guest: (gdb) target remote :12344. Load module (…

Java集合——Map

Map集合 Map用于保存具有映射关系的数据&#xff0c;以键值对的形式存储&#xff0c;支持通过key来访问value&#xff0c;因此key不能重复。 Map接口下主要有Hashtable、HashMap、LinkedHashMap、ConcurrentHashMap 四个主要的实现类&#xff0c;实现的基本原理类似&#xff0…

python3.6多进程导致的卡死报错问题

在使用python3.6的多进程的时候&#xff0c;遇到了进程卡死的问题。 具体表现为:多进程不停的开打爆了机器 排查后发现&#xff0c;原因是在使用apply_sync的时候&#xff0c;输入进去的参数大小太大导致的卡死&#xff0c;正常情况下应该是有这样的报错的&#xff1a; pytho…

jsp+ssm计算机毕业设计毕业设计管理系统【附源码】

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; JSPSSM mybatis Maven等等组成&#xff0c;B/S模式 Mave…

Spark3.3.0的DataFrame及Spark SQL编程的性能对比【单机模式下】

Spark3.3.0的DataFrame及Spark SQL编程的性能对比【单机模式下】 前言 Spark3.3.0较老早的2.4.0有极大的性能优化&#xff0c;尤其是对SQL做了大量的优化【数据倾斜等】&#xff0c;恰好近期遇到一些性能问题&#xff0c;特意写个Demo测试下DataFrame和Spark SQL在获取到相同…

【前端学习笔记】2. CSS

文章目录1 CSS 应用方式2 选择器3 样式3.1 高度和宽度3.2 块级和行内标签3.3 字体和颜色3.4 文字对齐方式3.5 浮动3.6 内边距3.7 外边距3.8 案例&#xff1a;小米商城4 知识点4.1 hover&#xff08;伪类&#xff09;4.2 after&#xff08;伪类&#xff09;4.3 position4.4 bord…

Ros VsCode C++ 打断点Debug过程实现 | 可能是当前好懂的教程

前言 学了蛮久的Ros&#xff0c;最近第一次有一个项目去复现,通过C实现。实现过程中必然需要Debug一步步的解决问题。然后发现VsCode上Debug Ros还是有点麻烦的&#xff0c;(不同于IDEA非常简明的Debug方式&#xff0c;这里要谴责一下微软&#xff0c;新建项目还要整includepa…