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添加链接描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/872922.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java中锁的全面详解(深刻理解各种锁)

一.Monitor 1. Java对象头 以32位虚拟机位例 对于普通对象,其对象头的存储结构为 总长为64位,也就是8个字节, 存在两个部分 Kclass Word: 其实也就是表示我们这个对象属于什么类型,也就是哪个类的对象.而对于Mark Word.查看一下它的结构存储 64位虚拟机中 而对于数组对象,我…

Java面试题(企业真题)

01.泛型的理解 泛型是Java 5引入的一种特性,它允许程序员在定义类、接口或方法时指定一个或多个类型参数,从而可以在运行时处理各种不同的数据类型,同时保持类型安全。泛型提供了编译时类型检查,消除了强制类型转换的需要,减少了运行时ClassCastException异常的可能性。02…

设计模式使用场景实现示例及优缺点(行为型模式——状态模式)

在一个遥远的国度中&#xff0c;有一个被称为“变幻之城”的神奇城堡。这座城堡有一种特殊的魔法&#xff0c;能够随着王国的需求改变自己的形态和功能。这种神奇的变化是由一个古老的机制控制的&#xff0c;那就是传说中的“状态宝石”。 在变幻之城中&#xff0c;有四颗宝石&…

神经网络中的激活函数举例,它们各自的特点,以及哪个激活函数效果更好,为什么

sigmoid&#xff1a; \(\sigma(x)1/(1e^{-x})\)&#xff1b; 优&#xff1a;将数值压缩到 0 1&#xff0c;导数为 \(\sigma(x)(1-\sigma(x))\) 好算。劣&#xff1a;输出均值非0&#xff08;0.5&#xff09;&#xff0c;梯度消失&#xff08;Gradient vanishing&#xff09;每次…

Java中的迭代器(Iterator)

Java中的迭代器&#xff08;Iterator&#xff09; 1、 迭代器的基本方法2、 迭代器的使用示例3、注意事项4、克隆与序列化5、结论 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 在Java中&#xff0c;迭代器&#xff08;Iterator&#xff0…

langchain 入门指南(三)- token的计算

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 在上一篇文章中&#xff0c;我们知道了&#xff0c;ChatOpenAI 对象调用 invoke 方法返回的的信息中&#xff0c; 包含了输入的 token 数…

Web开发:四角线框效果(HTML、CSS、JavaScript)

目录 一、实现效果 二、完整代码 三、页面准备 1、页面结构 2、初始样式 3、现有效果 三、线框实现 1、需求分析 2、线框结构 3、线框大小 4、线框位置 5、线框样式 6、移动线框 7、添加过渡效果 8、使用CSS变量 一、实现效果 如下图所示&#xff0c;当鼠标移动…

html 单页面引用vue3和element-plus

引入方式&#xff1a; element-plus基于vue3.0&#xff0c;所以必须导入vue3.0的js文件&#xff0c;然后再导入element-plus自身所需的js以及css文件&#xff0c;导入文件有两种方法&#xff1a;外部引用、下载本地使用 通过外部引用ElementPlus的css和js文件 以及Vue3.0文件 …

光热熔盐储能

长时储能的新赛道上&#xff0c;多种技术正在加速竞逐&#xff0c;谁最有可能成为其中的王者&#xff1f; 液流电池、压缩空气储能、重力储能&#xff1f;储能行业的玩家们通常不会想到的答案是光热熔盐储能。 1 基础的原理 光热发电系统包括太阳能集热、传储热、发电三大模…

DP讨论——适配器、桥接、代理、装饰器模式通用理解

学而时习之&#xff0c;温故而知新。 共性 适配器、桥接、代理和装饰器模式&#xff0c;实现上基本没啥区别&#xff0c;怎么区分&#xff1f;只能从上下文理解&#xff0c;看目的是啥。 它们&#xff0c;我左看上看下看右看&#xff0c;发现理解可以这么简单:都是A类调用B/…

MK米客方德推出新一代工业级SD NAND

--更长寿命、更高速度、更优功耗 目录 --更长寿命、更高速度、更优功耗 1.LGA-8封装&#xff1a; 2.工业级SLC存储颗粒&#xff1a; 3.高IOPS性能&#xff1a; 4.健康状态侦测(Smart Function)&#xff1a; 5.内嵌ECC校验、坏块管理、垃圾回收、磨损平均算法等功能。 6…

大厂面试官问我:Redis为什么使用哈希槽的方式进行数据分片?为什么不适用一致性哈希的方式?【后端八股文十三:Redis 集群哈希八股文合集(1)】

本文为【Redis 集群哈希 八股文合集&#xff08;1&#xff09;】初版&#xff0c;后续还会进行优化更新&#xff0c;欢迎大家关注交流~ hello hello~ &#xff0c;这里是绝命Coding——老白~&#x1f496;&#x1f496; &#xff0c;欢迎大家点赞&#x1f973;&#x1f973;关注…

whisper-api语音识别语音翻译高性能兼容openai接口协议的开源项目

whisper-api 介绍 使用openai的开源项目winsper语音识别开源模型封装成openai chatgpt兼容接口 软件架构 使用uvicorn、fastapi、openai-whisper等开源库实现高性能接口 更多介绍 [https://blog.csdn.net/weixin_40986713/article/details/138712293](https://blog.csdn.n…

leetcode-46. 全排列

题目描述 给定一个不含重复数字的数组 nums &#xff0c;返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。 示例 1&#xff1a; 输入&#xff1a;nums [1,2,3] 输出&#xff1a;[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]示例 2&#xff1a; 输入&#xf…

【ELK+Kafka+filebeat分布式日志收集】分布式日志收集详解

分布式日志收集是一种用于在分布式系统中收集、聚合、存储和分析日志数据的技术。随着系统规模的扩大和分布式架构的普及,单节点的日志收集和处理方案已经难以满足需求。因此,分布式日志收集系统应运而生。以下是分布式日志收集的详细讲解: 一、背景 1、为什么需要分布式日…

百日筑基第二十三天-23种设计模式-创建型总汇

百日筑基第二十三天-23种设计模式-创建型总汇 前言 设计模式可以说是对于七大设计原则的实现。 总体来说设计模式分为三大类&#xff1a; 创建型模式&#xff0c;共五种&#xff1a;单例模式、简单工厂模式、抽象工厂模式、建造者模式、原型模式。结构型模式&#xff0c;共…

防洪墙的安全内容检测+http请求头

1、华为的IAE引擎&#xff1a;内部工作过程 IAE引擎主要是针对2-7层进行一个数据内容的检测 --1、深度检测技术 (DPI和DPF是所有内容检测都必须要用到的技术) ---1、DPI--深度包检测&#xff0c;针对完整的数据包&#xff0c;进行内容的识别和检测 1、基于特征子的检…

Windows图形界面(GUI)-DLG-C/C++ - 列表视图(ListView)

公开视频 -> 链接点击跳转公开课程博客首页 -> ​​​​​​链接点击跳转博客主页 目录 列表视图(ListView) 控件类型 初始化控件环境 示例代码 列表视图(ListView) 控件类型 详细信息视图&#xff08;Report View&#xff09;&#xff1a;数据以列的形式显示&…

Collections.unmodifiableList

Collections.unmodifiableList 是 Java Collections Framework 提供的一个方法&#xff0c;用于创建一个不可修改的视图&#xff08;unmodifiable view&#xff09;列表。这个方法返回的列表是对原始列表的一个包装&#xff0c;任何对这个包装列表的修改操作都会抛出 Unsupport…

数据分析01——系统认识数据分析

1.数据分析的全貌 1.1观测 1.1.1 观察 &#xff08;1&#xff09;采集数据 a.采集数据&#xff1a;解析系统日志 当你在看视频的时候———就会产生日志———解析日志———得到数据 b.采集数据&#xff1a;埋点获取新数据&#xff08;自定义记录新的信息&#xff09; 日志…