iOS使用Rust调研
编辑已恢复
我们已与您断开连接。尝试重连时会保存您所做的变更。尝试重连
标题 1
已保存
Bin Song
B
要发布此内容,请选择键盘上的 ⌘Enter。
发布
关闭
Rust技术空间
…
跨平台使用调研
iOS使用Rust调研
添加表情符号
添加标题图像
添加状态
一、iOS 项目接入 Rust Library
约定:
iOS 项目目录 DemoApp
Rust Library:demo-library-ffi
1.1、Rust Library
将 Rust Library 代码 Clone 到 iOS 项目根目录下: DemoApp/demo-library-ffi;
修改 DemoApp/rust-library/Cargo.toml,将 Rust Library 修改为静态库
[lib]
crate-type = [“staticlib”]
在 DemoApp 目录下创建一个新的顶层 Cargo.toml 文件:
[workspace]
members = [
“demo-library-ffi”
]
现在可以直接使用 cargo build 来生成 rust 静态库了:
DemoApp/target/debug/demo-library-ffi.a
1.2、iOS Project
1.2.1
打开 Xcode target configuration → Build Phases → Link Binary with Libraries 选项卡,选择 Add files,将前面生成的 DemoApp/target/debug/demo-library-ffi.a 文件添加进去;
是的,这个不是最终我们需要的正确静态库文件,因为它只有当前打包机器的架构,不要紧,我们会在下面步骤中修复它;
1.2.2
用文本编辑器打开 project.pbxproj,搜索并替换 Debug 和 Release 两处 LIBRARY_SEARCH_PATHS
LIBRARY_SEARCH_PATHS = (
“ ( i n h e r i t e d ) " , " (inherited)", " (inherited)","(PROJECT_DIR)/target/debug”,
);
Debug 替换为:
“LIBRARY_SEARCH_PATHS[sdk=iphoneos*][arch=arm64]” = “ ( P R O J E C T D I R ) / t a r g e t / a a r c h 64 − a p p l e − i o s / d e b u g " ; " L I B R A R Y S E A R C H P A T H S [ s d k = i p h o n e s i m u l a t o r ∗ ] [ a r c h = a r m 64 ] " = " (PROJECT_DIR)/target/aarch64-apple-ios/debug"; "LIBRARY_SEARCH_PATHS[sdk=iphonesimulator*][arch=arm64]" = " (PROJECTDIR)/target/aarch64−apple−ios/debug";"LIBRARYSEARCHPATHS[sdk=iphonesimulator∗][arch=arm64]"="(PROJECT_DIR)/target/aarch64-apple-ios-sim/debug”;
“LIBRARY_SEARCH_PATHS[sdk=iphonesimulator*][arch=x86_64]” = “ ( P R O J E C T D I R ) / t a r g e t / x 8 6 6 4 − a p p l e − i o s / d e b u g " ; R e l e a s e 替换为: " L I B R A R Y S E A R C H P A T H S [ s d k = i p h o n e o s ∗ ] [ a r c h = a r m 64 ] " = " (PROJECT_DIR)/target/x86_64-apple-ios/debug"; Release 替换为: "LIBRARY_SEARCH_PATHS[sdk=iphoneos*][arch=arm64]" = " (PROJECTDIR)/target/x8664−apple−ios/debug";Release替换为:"LIBRARYSEARCHPATHS[sdk=iphoneos∗][arch=arm64]"="(PROJECT_DIR)/target/aarch64-apple-ios/release”;
“LIBRARY_SEARCH_PATHS[sdk=iphonesimulator*][arch=arm64]” = “ ( P R O J E C T D I R ) / t a r g e t / a a r c h 64 − a p p l e − i o s − s i m / r e l e a s e " ; " L I B R A R Y S E A R C H P A T H S [ s d k = i p h o n e s i m u l a t o r ∗ ] [ a r c h = x 8 6 6 4 ] " = " (PROJECT_DIR)/target/aarch64-apple-ios-sim/release"; "LIBRARY_SEARCH_PATHS[sdk=iphonesimulator*][arch=x86_64]" = " (PROJECTDIR)/target/aarch64−apple−ios−sim/release";"LIBRARYSEARCHPATHS[sdk=iphonesimulator∗][arch=x8664]"="(PROJECT_DIR)/target/x86_64-apple-ios/release”;
1.2.3
再次打开 Build Phases 选项卡,添加一个 Script,并移动到 Compile Sources 上方,可以命名为: Build Rust library :
bash ${PROJECT_DIR}/bin/compile-rust-lib.sh demo-library-ffi $RUSTBUILDCONF
第二个参数 RUSTBUILDCONF是传递给脚本的环境变量,我们先定义它们:
打开 Build Settings 选项卡,点击 + 添加 User-Defined Setting,为其命名 RUSTBUILDCONF 并根据构建变量选择一个值:Debug 中填写 DEBUG,Release 中填写 RELEASE。
1.2.4
构建脚本 bin/compile-rust-lib.sh
#!/usr/bin/env bash
if [ “$#” -ne 2 ]
then
echo “Usage (note: only call inside xcode!):”
echo “compile-rust-lib.sh <FFI_TARGET> ”
exit 1
fi
what to pass to cargo build -p, e.g. rust_lib_ffi
FFI_TARGET=$1
RUSTBUILDCONF from our xcconfigs
RUSTBUILDCONF=$2
RELFLAG=
if [[ “$RUSTBUILDCONF” != “DEBUG” ]]; then
RELFLAG=–release
fi
set -euvx
if [[ -n “${DEVELOPER_SDK_DIR:-}” ]]; then
Assume we’re in Xcode, which means we’re probably cross-compiling.
In this case, we need to add an extra library search path for build scripts and proc-macros,
which run on the host instead of the target.
(macOS Big Sur does not have linkable libraries in /usr/lib/.)
export LIBRARY_PATH=“ D E V E L O P E R S D K D I R / M a c O S X . s d k / u s r / l i b : {DEVELOPER_SDK_DIR}/MacOSX.sdk/usr/lib: DEVELOPERSDKDIR/MacOSX.sdk/usr/lib:{LIBRARY_PATH:-}”
fi
IS_SIMULATOR=0
if [ “${LLVM_TARGET_TRIPLE_SUFFIX-}” = “-simulator” ]; then
IS_SIMULATOR=1
fi
for arch in A R C H S ; d o c a s e " ARCHS; do case " ARCHS;docase"arch" in
x86_64)
if [ $IS_SIMULATOR -eq 0 ]; then
echo “Building for x86_64, but not a simulator build. What’s going on?” >&2
exit 2
fi
# Intel iOS simulatorexport CFLAGS_x86_64_apple_ios="-target x86_64-apple-ios"$HOME/.cargo/bin/cargo build -p $FFI_TARGET --lib $RELFLAG --target x86_64-apple-ios;;arm64)if [ $IS_SIMULATOR -eq 0 ]; then# Hardware iOS targets$HOME/.cargo/bin/cargo build -p $FFI_TARGET --lib $RELFLAG --target aarch64-apple-ioselse$HOME/.cargo/bin/cargo build -p $FFI_TARGET --lib $RELFLAG --target aarch64-apple-ios-simfi
esac
done
二、问题调研
- Rust访问网络是否需要原生语言的干预?需支持协议如:gRPC/RESTful/WebSocket/UDP
Rust 可以直接访问网络,并不需要原生语言的干预 - Rust与原生语言的协作方式,FFI/JNI or 其他?
FFI
cbindgen
rsbind - 如何接收Rust发起的回调?
使用函数指针,可以参考这个人的代码:https://github.com/thombles/dw2019rust/blob/master/modules/07%20-%20Swift%20callbacks.md
或者使用 rsbind - Rust是否可以直接访问本地(图片/文件)/沙箱文件?
https://docs.rs/cacao/latest/cacao/index.html - Rust是否可以直接访问本地数据库?本地支持哪些常用数据库并且Rust有相应的封装?
可以直接使用 sqlite,如果要用 CoreData,需要通过 FFI - 构建时各平台的构建步骤以及命令
参考 1.2.4
或者使用 rsbind - Android/iOS端异常调用栈的分析方法,是否有工具/框架可以配合
- 打包后包大小的变化
1.网络
方案1: reqwest, 关闭bitcode的情况下,包增加7.6MB
2.数据库
方案1:rusqlite, 关闭bitcode的情况下,包增加3.6MB
相关文章:
iOS使用Rust调研
编辑已恢复 我们已与您断开连接。尝试重连时会保存您所做的变更。尝试重连 标题 1 已保存 Bin Song B 要发布此内容,请选择键盘上的 ⌘Enter。 发布 关闭 Rust技术空间 … 跨平台使用调研 iOS使用Rust调研 添加表情符号 添加标题图像 添加状态 一、iOS 项…...

抖音引流推广的几个方法,抖音全自动引流脚本软件详细使用教学
大家好我是你们的小编一辞脚本,今天给大家分享新的知识,很开心可以在CSDN平台分享知识给大家,很多伙伴看不到代码我先录制一下视频 在给大家做代码,给大家分享一下抖音引流脚本的知识和视频演示 不懂的小伙伴可以认真看一下,我们…...

k8s概念-DaemonSet
回到目录 参考链接https://v1-23.docs.kubernetes.io/zh/docs/concepts/workloads/controllers/daemonset/ DaemonSet 确保全部(或者某些)节点上运行一个 Pod 的副本 当节点加入到K8S集群中,pod会被(DaemonSet)调度到…...

Mac 终端快捷键设置:如何给 Mac 中的 Terminal 设置 Ctrl+Alt+T 快捷键快速启动
Mac 电脑中正常是没有直接打开终端命令行的快捷键指令的,但可以通过 commandspace 打开聚焦搜索,然后输入 ter 或者 terminal 全拼打开。但习惯了 linux 的同学会觉得这个操作很别扭。于是我们希望能通过键盘按键直接打开。 操作流程如下: 1…...

VR 变电站事故追忆反演——正泰电力携手图扑
VR(Virtual Reality,虚拟现实)技术作为近年来快速发展的一项新技术,具有广泛的应用前景,支持融合人工智能、机器学习、大数据等技术,实现更加智能化、个性化的应用。在电力能源领域,VR 技术在高性能计算机和专有设备支…...

fpga开发——蜂鸣器
蜂鸣器的原理 有源蜂鸣器和无源蜂鸣器 无源蜂鸣器利用电磁感应现象,为音圈接入交变电流后形成的电磁铁与永磁铁相吸或相斥而推动振膜发声,接入直流电只能持续推动振膜而无法产生声音,只能在接通或断开时产生声音。无源蜂鸣器的工作原理与扬声…...

【Liux下6818开发板(ARM)】触摸屏
(꒪ꇴ꒪ ),hello我是祐言博客主页:C语言基础,Linux基础,软件配置领域博主🌍快上🚘,一起学习!送给读者的一句鸡汤🤔:集中起来的意志可以击穿顽石!作者水平很有限,如果发现错误&#x…...

苍穹外卖day11——数据统计图形报表(Apache ECharts)
效果展示 Apache ECharts 介绍 常见图表 入门案例 快速上手 - Handbook - Apache ECharts 营业额统计——需求分析与设计 产品原型 接口设计 VO设计 营业额统计——代码开发 Controller中 /*** 数据统计相关接口*/ RestController RequestMapping("/admin/report&qu…...
在制作PC端Game Launcher游戏启动器时涉及到的技术选型
1)在制作PC端Game Launcher游戏启动器时涉及到的技术选型 2)如何将图片显示到Canvas的Raw Image上面 3)Unity 2018.4.4f1退出重启后出现黑屏 4)如何获取到GPU耗时 这是第346篇UWA技术知识分享的推送,精选了UWA社区…...
SQL力扣练习(九)
目录 1.订单最多的用户(586) 示例 1 解法一(limit) 解法二(dense_rank()) 2.体育馆的人流量 示例 1 解法一(临时表) 解法二(三表法) 1.订单最多的用户(586) 表: Orders --------------------------- | Column Name | Type | ---------…...

软考高级架构师笔记-10数学计算题
目录 1. 前文回顾 & 考情分析2. 最小生成树3. 最短路径4. 网络与最大流量5. 线性规划6. 动态规划/决策表7. 博弈论8. 状态转移矩阵9. 决策论10. 结语1. 前文回顾 & 考情分析 前文回顾: 软考高级架构师笔记-1计算机硬件软考高级架构师笔记-2计算机软件(操作系统)软考…...
设计模式五:建造者模式(Builder Pattern)
建造者模式(Builder Pattern)是一种创建型设计模式,用于通过一系列步骤来构建复杂对象。它将对象的构建过程与其表示分离,从而允许相同的构建过程可以创建不同的表示。 建造者模式中的几个角色: 产品(Product):表示被构建的复杂…...

C++多线程编程(包含c++20内容)
C多线程编程(包含c20内容) 文章目录 C多线程编程(包含c20内容)线程通过函数指针创建线程通过函数对象创建线程通过lambda创建线程通过成员函数创建线程线程本地存储取消线程自动join线程从线程获得结果 原子操作库原子操作原子智能指针原子引用使用原子类型等待原子变量 互斥互…...

【C语言】通讯录2.0 (动态增长版)
前言 通讯录是一种记录联系人信息的工具,包括姓名、电话号码、电子邮件地址、住址等。 文章的一二三章均于上一篇相同,可以直接看第四章改造内容。 此通讯录是基于通讯录1.0(静态版)的基础上进行改进,请先看系列文字第…...

详解AMQP协议以及JAVA体系中的AMQP
目录 1.概述 1.1.简介 1.2.抽象模型 2.spring中的amqp 2.1.spring amqp 2.2.spring boot amqp 1.概述 1.1.简介 AMQP,Advanced Message Queuing Protocol,高级消息队列协议。 百度百科上的介绍: 一个提供统一消息服务的应用层标准高…...

跨境电商外贸常态下,深度分析Live Market的优势
据统计,今年上半年,面对复杂严峻的外部环境,我国外贸进出口规模在历史同期首次突破20万亿元,展现较强韧性。我国正处于大力支持跨境电商发展的时代节点。在此背景下,无数商家准备抓住时代机遇,将品牌影响力从国内延伸至全世界。同…...
vue2企业级项目(八)
vue2企业级项目(八) 组件封装(二) 4、searchForm 创建components/searchForm/index.js import XSearchForm from "./index.vue"; export default XSearchForm;使用案例 <template><div class"wrap"…...

小研究 - 主动式微服务细粒度弹性缩放算法研究(二)
微服务架构已成为云数据中心的基本服务架构。但目前关于微服务系统弹性缩放的研究大多是基于服务或实例级别的水平缩放,忽略了能够充分利用单台服务器资源的细粒度垂直缩放,从而导致资源浪费。为此,本文设计了主动式微服务细粒度弹性缩放算法…...

【雕爷学编程】Arduino动手做(177)---ESP-32 掌控板
37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的&am…...

使用Gunicorn+Nginx部署Flask项目
部署-开发机上的准备工作 确认项目没有bug。用pip freeze > requirements.txt将当前环境的包导出到requirements.txt文件中,方便部署的时候安装。将项目上传到服务器上的/srv目录下。这里以git为例。使用git比其他上传方式(比如使用pycharmÿ…...

利用最小二乘法找圆心和半径
#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...

突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合
强化学习(Reinforcement Learning, RL)是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程,然后使用强化学习的Actor-Critic机制(中文译作“知行互动”机制),逐步迭代求解…...

边缘计算医疗风险自查APP开发方案
核心目标:在便携设备(智能手表/家用检测仪)部署轻量化疾病预测模型,实现低延迟、隐私安全的实时健康风险评估。 一、技术架构设计 #mermaid-svg-iuNaeeLK2YoFKfao {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg…...

循环冗余码校验CRC码 算法步骤+详细实例计算
通信过程:(白话解释) 我们将原始待发送的消息称为 M M M,依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)(意思就是 G ( x ) G(x) G(x) 是已知的)࿰…...

SCAU期末笔记 - 数据分析与数据挖掘题库解析
这门怎么题库答案不全啊日 来简单学一下子来 一、选择题(可多选) 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘:专注于发现数据中…...

CMake 从 GitHub 下载第三方库并使用
有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...
[Java恶补day16] 238.除自身以外数组的乘积
给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O(n) 时间复杂度…...

蓝桥杯3498 01串的熵
问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798, 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…...

论文笔记——相干体技术在裂缝预测中的应用研究
目录 相关地震知识补充地震数据的认识地震几何属性 相干体算法定义基本原理第一代相干体技术:基于互相关的相干体技术(Correlation)第二代相干体技术:基于相似的相干体技术(Semblance)基于多道相似的相干体…...

NXP S32K146 T-Box 携手 SD NAND(贴片式TF卡):驱动汽车智能革新的黄金组合
在汽车智能化的汹涌浪潮中,车辆不再仅仅是传统的交通工具,而是逐步演变为高度智能的移动终端。这一转变的核心支撑,来自于车内关键技术的深度融合与协同创新。车载远程信息处理盒(T-Box)方案:NXP S32K146 与…...