当前位置: 首页 > news >正文

rust编译安卓各个平台so库

安卓studio 安装SDK 和 NDK

所有操作是mac m1 上操作的

NDK 可以在 Android studio 设置里面,搜索sdk ,然后看下SDK 位置例如我下面的位置:

/Users/admin/Library/Android/sdk/ndk

Android NDK(Native Development Kit)生成一个独立的工具链

# 其中/Users/admin/go/ndk/arm64 这个地址是生成各种平台目录
# aarch64-linux-android
python3 /Users/admin/Library/Android/sdk/ndk/27.0.12077973/build/tools/make_standalone_toolchain.py --api 27 --arch arm64 --install-dir /Users/admin/go/ndk/arm64# armv7-linux-androideabi
python3 /Users/admin/Library/Android/sdk/ndk/27.0.12077973/build/tools/make_standalone_toolchain.py --api 27 --arch arm --install-dir /Users/admin/go/ndk/arm# x86_64-linux-android
python3 /Users/admin/Library/Android/sdk/ndk/27.0.12077973/build/tools/make_standalone_toolchain.py  --api 27 --arch x86_64 --install-dir /Users/admin/go/ndk/x86_64

编辑 ~/.cargo/config 文件添加

# 这个是我api 27版本的,30版本好像ar要改 
[target.aarch64-linux-android]
ar = "/Users/admin/go/ndk/arm64/bin/llvm-ar"
linker = "/Users/admin/go/ndk/arm64/bin/aarch64-linux-android-clang"[target.armv7-linux-androideabi]
ar = "/Users/admin/go/ndk/arm/bin/llvm-ar"
linker = "/Users/admin/go/ndk/arm/bin/arm-linux-androideabi-clang"[target.x86_64-linux-android]
ar = "/Users/admin/go/ndk/x86_64/bin/llvm-ar"
linker = "/Users/admin/go/ndk/x86_64/bin/x86_64-linux-android-clang"30 版本ar路径变了
[target.aarch64-linux-android]
ar = "/Users/你的用户名/NDK/arm64/bin/aarch64-linux-android-ar"
linker = "/Users/你的用户名/NDK/arm64/bin/aarch64-linux-android-clang"[target.armv7-linux-androideabi]
ar = "/Users/你的用户名/NDK/arm/bin/arm-linux-androideabi-ar"
linker = "/Users/你的用户名/NDK/arm/bin/arm-linux-androideabi-clang"[target.i686-linux-android]
ar = "/Users/你的用户名/NDK/x86/bin/i686-linux-android-ar"
linker = "/Users/你的用户名/NDK/x86/bin/i686-linux-android-clang"

rust 程序流程

创建项目
 cargo new --lib my_crypto_lib 
修改 Cargo.toml
# 下面几个值是优化包的体积 打出来so很小
[profile.release]
lto = true
opt-level = "z"
panic = "abort"
codegen-units = 1[dependencies]
jni = "0.21.1"[lib]
name = "my_crypto_lib"
crate-type = ["cdylib"]
rust程序
use jni::objects::{JClass, JString};
use jni::JNIEnv;
use jni::sys::{jint,jstring};// 注意如果包名带下划线需要写成 _1#[no_mangle]
pub extern "C" fn Java_com_example_rust_1app_RustClass_add(_env: JNIEnv, _class: JClass, a: jint, b: jint) -> jint {a + b
}#[no_mangle]
pub extern "C" fn  Java_com_example_rust_1app_RustClass_processStringo<'local>(mut env: JNIEnv<'local>, _class:  JClass<'local>, input: JString<'local>) -> jstring {// First, we have to get the string out of Java. Check out the `strings`// module for more info on how this works.let input: String =env.get_string(&input).expect("Couldn't get java string!").into();// 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 跨平台是否安装
rustup show
安装多个安卓架构平台
# arm64
rustup target install aarch64-linux-android 
# arm32
rustup target install armv7-linux-androideabi
# amd64
rustup target install x86_64-linux-android
# amd32
rustup target install i686-linux-androidrustup show
验证编译rust so 动态库
cargo build --target aarch64-linux-android --release
cargo build --target armv7-linux-androideabi --release
cargo build --target x86_64-linux-android --release
cargo build --target i686-linux-android --release
更小的生成方式
 cargo install cargo-ndk 确认cargo intall --list
多个平台打包,这个方式比上面cargo build 要小很多具体原因不知道是什么,ndk这个库估计做了优化
# 会生成到项目目录 jniLibs 下,
cargo ndk -t armeabi-v7a -t arm64-v8a -t x86 -t x86_64 -o ./jniLibs build --release

生成如下:
在这里插入图片描述
再jniLibs目录查看下大小

find . -type f -exec du -h {} +

打包出来很小

xz:jniLibs (master*) $ find . -type f -exec du -h {} +8.0K    ./.DS_Store80K    ./armeabi-v7a/libmy_crypto_lib.so
264K    ./arm64-v8a/libmy_crypto_lib.so
128K    ./x86_64/libmy_crypto_lib.so
然后吧 jniLibs 复制到java项目

如图:
在这里插入图片描述

build.gradle 修改下引入
android {
......sourceSets {main {jniLibs.srcDirs = ['jniLibs']}androidTest {jniLibs.srcDirs = ['jniLibs']}}....
}

如图
在这里插入图片描述

安卓java程序
package com.example.rust_app;public class RustClass {static {System.loadLibrary("my_crypto_lib");}public native int add(int a, int b);public native String processStringo(String a);public  void addTest() {int result = add(99, 5);System.out.println("Result: " + result);String resultStr = processStringo(",world");System.out.println("string:" + resultStr);}
}

测试效果
在这里插入图片描述

借鉴了文章: https://blog.csdn.net/ysy950803/article/details/122882360
rust jni 文档地址: https://docs.rs/jni/latest/jni/

openssl 编译失败解决方式

https://gist.github.com/ospfranco/7b691ddc8f2fdba66dde5f67564a7c69

https://stackoverflow.com/questions/76352747/openssl-cross-compilation-fails添加链接描述

相关文章:

  • 艺术与技术的交响曲:CSS绘图的艺术与实践
  • linux搭建mysql主从复制(一主一从)
  • Autosar RTE配置-Assembly和Delegation的使用-基于ETAS软件
  • Collections.unmodifiableList
  • 【Vue】Vue3 安装 Tailwind CSS 入门
  • Golang | Leetcode Golang题解之第240题搜索二维矩阵II
  • vue2导入elementui组件库
  • LabVIEW电路产品功能自动检测系统
  • 目标检测入门:4.目标检测中的一阶段模型和两阶段模型
  • 【ELK+Kafka+filebeat分布式日志收集】分布式日志收集详解
  • Flutter 状态管理新境界:多Provider并行驱动UI
  • 快捷:通过胶水语言实现工作中测试流程并行、加速
  • nginx全局块的user指令
  • 基于 Vue 3 和 Element Plus 构建图书管理系统
  • 计算机毕业设计Python深度学习游戏推荐系统 Django PySpark游戏可视化 游戏数据分析 游戏爬虫 Scrapy 机器学习 人工智能 大数据毕设
  • 【划重点】MySQL技术内幕:InnoDB存储引擎
  • 2019.2.20 c++ 知识梳理
  • ES6语法详解(一)
  • JavaScript 事件——“事件类型”中“HTML5事件”的注意要点
  • js中forEach回调同异步问题
  • SegmentFault 技术周刊 Vol.27 - Git 学习宝典:程序员走江湖必备
  • vagrant 添加本地 box 安装 laravel homestead
  • 笨办法学C 练习34:动态数组
  • 好的网址,关于.net 4.0 ,vs 2010
  • 基于Mobx的多页面小程序的全局共享状态管理实践
  • 开年巨制!千人千面回放技术让你“看到”Flutter用户侧问题
  • 聊聊directory traversal attack
  • 前嗅ForeSpider采集配置界面介绍
  • 强力优化Rancher k8s中国区的使用体验
  • 巧用 TypeScript (一)
  • -- 数据结构 顺序表 --Java
  • 译有关态射的一切
  • 阿里云服务器购买完整流程
  • 国内开源镜像站点
  • # 利刃出鞘_Tomcat 核心原理解析(二)
  • ${ }的特别功能
  • (16)Reactor的测试——响应式Spring的道法术器
  • (2024,Flag-DiT,文本引导的多模态生成,SR,统一的标记化,RoPE、RMSNorm 和流匹配)Lumina-T2X
  • (42)STM32——LCD显示屏实验笔记
  • (55)MOS管专题--->(10)MOS管的封装
  • (7) cmake 编译C++程序(二)
  • (C语言)逆序输出字符串
  • (react踩过的坑)Antd Select(设置了labelInValue)在FormItem中initialValue的问题
  • (二)Pytorch快速搭建神经网络模型实现气温预测回归(代码+详细注解)
  • (二)正点原子I.MX6ULL u-boot移植
  • (黑客游戏)HackTheGame1.21 过关攻略
  • (十一)c52学习之旅-动态数码管
  • (五)c52学习之旅-静态数码管
  • (转)Groupon前传:从10个月的失败作品修改,1个月找到成功
  • (转)创业的注意事项
  • (转载)hibernate缓存
  • .Net Core与存储过程(一)
  • .NET Standard 支持的 .NET Framework 和 .NET Core
  • .NET 指南:抽象化实现的基类
  • .NET 中使用 TaskCompletionSource 作为线程同步互斥或异步操作的事件