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

Rust移动开发:Rust在iOS端集成使用介绍

iOS调用Rust

  • 上篇介绍了 Rust移动开发:Rust在Android端集成使用介绍, 这篇主要看下iOS上如何使用Rust,Rust可以给移动端开发提供跨平台,通用组件支持。

  •  该篇适合对iOS、Rust了解,想知道如何整合调用和编译的,如果想要工程源码,可以评论或留言有解疑也可进行询问(更多最新文章也可关注微信公号:良技漫谈) 

图片

一,开发环境:

  • 确保xcode开发环境,推荐官方文档, 安装即可

  • rust开发环境

  •  xcode及iOS调试设备

二,添加rust交叉编译

  •  同android一样,可以添加支持ios的编译

rustup target add aarch64-apple-ios x86_64-apple-ios
  •  初始化 cargo-lipo : 这个create可以编译rs为iOS需要的库

cargo install cargo-lipo

三,创建工程

  • 这里的rs代码直接 (参考了mozilla的例子,只为测试验证集成过程)

  • 创建iOS基本工程,并创建rust的库工程,可以创建lib,也可以直接rs工程。 (一套rust代码,提供多个平台,那一般可以创建lib库,这样rust工程来调试后,统一对外提供lib库代码,由lib库代码编译对应的so,或者.a文件)

cargo new Rust_iOS --lib
  • 这里使用 Rust_iOS 作为为iOS工程提供的rust 库代码,通过 cargo-lipo 编译出.a的库文件,为ios工程进行调用。

rust代码添加

  • 在lib.rs里添加下边代码

use std::ffi::{CStr, CString};
use std::os::raw::c_char;//#[no_mangle] 告诉编译器不要破坏函数名,确保函数名称被导入到 C 文件
//extern 告诉 Rust 编译器方法将要在 Rust 以外的地方调用,要确保其按照 C 的调用规则编译。
#[no_mangle]
pub extern "C" 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()
}#[no_mangle]
pub extern "C" fn rust_greeting_free(s: *mut c_char) {unsafe {if s.is_null() {return;}CString::from_raw(s)};
}
  • • greetings.h :src下添加一个名为 greetings.h 的新文件,来定义一下 C 接口,iOS调用的Rust函数在这里定义

#include <stdint.h>
const char* rust_greeting(const char* to);
void rust_greeting_free(char *);
  •  Cargo.toml定义编译类型: staticlib 编译会生成 .a 文件(在 Linux 和 MacOS 上),或 .lib 文件(在 Windows 上)。

[lib]
name = "greetings"
crate-type = ["staticlib", "cdylib"]

  • 编译成静态库:

cargo lipo --release

构建产物位置在 target/下,通用 iOS 库的位置在 /target/universal/release/libRust_iOS.a

四,iOS工程引入Rust库:

导入 libRust_iOS.a 库:

  •  创建demo ios 工程, 导入 libRust_iOS.a 库(从rust工程找到,直接拖进入工程target下general)

  • 链接 libresolv.tbd。点击 Linked Frameworks 列表底部的 + 并在搜索框中键入 libresolv。选择 libresolv.tbd

bridging header创建:

  • 创建之前先把之前定义在rust工程里的.h文件引入过来,这个.h文件是rust代码调用的声明入口(File\Add files to“iOSIntegratingRust” )

  • 创建bridging header: File\New\File..。从提供的选项中选择 iOS Source Header File 并选择 Next。将文件命名为 Greetings-Bridging-Header.h 并选择 Create

  •  引入greetings.h

#ifndef Greetings_Bridging_Header_h
#define Greetings_Bridging_Header_h
#import "greetings.h"
#endif

iOS Build Settings:

  •  设置Objective-C Bridging Header链接要的.h文件, 工程 target 里打开 Build Settings 选项卡。将 Objective-C Bridging Header设置为$(PROJECT_DIR)/Greetings-Bridging-Header.h (要看自己.h所在的位置)

  • 设置 Xcode 要链接 Rust 库的路径, Build Settings 中 Library Search Paths中设置 $(PROJECT_DIR)/../Rust_iOS/target/universal/release (要看自己库实际位置)

五,iOS代码调用:

  •  从刚demo工程里新建一个 swift 文件,命名为 RustGreetings

import Foundation
class RustGreetings {func sayHello(to: String) -> String {let result = rust_greeting(to)let swift_result = String(cString: result!)rust_greeting_free(UnsafeMutablePointer(mutating: result))return swift_result}
}
  •  ViewController.swift里 添加代码验证调用

    override func viewDidLoad() {super.viewDidLoad()// Do any additional setup after loading the view.let rustGreetings = RustGreetings()print("\(rustGreetings.sayHello(to: "world"))")}

PS: 也欢迎大家评论和交流~ 更多文章也可关注微信公号:良技漫谈

相关文章:

Rust移动开发:Rust在iOS端集成使用介绍

iOS调用Rust 上篇介绍了 Rust移动开发&#xff1a;Rust在Android端集成使用介绍, 这篇主要看下iOS上如何使用Rust&#xff0c;Rust可以给移动端开发提供跨平台&#xff0c;通用组件支持。 该篇适合对iOS、Rust了解&#xff0c;想知道如何整合调用和编译的&#xff0c;如果想要…...

虚拟现实技术在旅游行业的应用

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 虚拟现实技术在旅游行业的应用 虚拟现实技术在旅游行业的应用 虚拟现实技术在旅游行业的应用 引言 虚拟现实技术概述 定义与原理…...

《Java核心技术 卷I》Swing使用颜色

使用颜色 使用Graphics2D类的setPaint方法可以为图形上下文上的所有后续的绘制操作选择颜色。例如&#xff1a; g2.setPaint(Color.RED); g2.drawString("Warning!",100,100); 可以用一种颜色填充一个封闭图像(例如&#xff1a;矩形或椭圆)的内部。为此&#xff…...

神书《从零构建大模型》分享,尚未发布,GitHub标星22k!!

《从零构建大模型》是一本即将于今年10月底发布的书籍&#xff0c;github已经吸引了惊人的21.7k标星&#xff01;作者是威斯康星大学麦迪逊分校的终身教授&#xff0c;在GitHub、油管、X上拥有大量粉丝&#xff0c;是一位真正的大佬。 本书免费获取地址 在本书中&#xff0…...

【JavaEE进阶】Spring AOP 原理

在之前的博客中 【JavaEE进阶】Spring AOP使用篇_aop多个切点-CSDN博客 我们主要学习了SpringAOP的应用, 接下来我们来学习SpringAOP的原理, 也就是Spring是如何实现AOP的. SpringAOP 是基于动态代理来实现AOP的,咱们学习内容主要分以下两部分 1.代理模式 2.Spring AOP源码剖…...

【网络安全】2.3 安全的网络设计_2.防御深度原则

文章目录 一、网络架构二、网络设备三、网络策略四、处理网络安全事件五、实例学习&#xff1a;安全的网络设计结论 网络设计是网络安全的基础&#xff0c;一个好的网络设计可以有效的防止攻击者的入侵。在本篇文章中&#xff0c;我们将详细介绍如何设计一个安全的网络&#…...

测绘程序设计|C#字符串及其操作|分割|取子串|格式化数值|StringBuilder类

由于微信公众号改变了推送规则&#xff0c;为了每次新的推送可以在第一时间出现在您的订阅列表中&#xff0c;记得将本公众号设为星标或置顶喔~ 简单介绍了C#字符串分割、取子串、拼接、格式化数值以及StringBuilder类&#xff0c;拿捏测绘程序设计大赛~ &#x1f33f;前言 字…...

自然语言处理——Hugging Face 详解

Hugging Face 是一个以自然语言处理&#xff08;NLP&#xff09;为核心的人工智能平台和开源社区&#xff0c;提供了一系列非常流行的机器学习工具和预训练模型&#xff0c;尤其在文本生成、分类、翻译、情感分析等任务中表现出色。Hugging Face 旗下最为著名的项目是 Transfor…...

本地保存mysql凭据实现免密登录mysql

本地保存mysql凭据 mysql加密登录文件简介加密保存mysql用户的密码到本地凭据 mysql加密登录文件简介 要在 mysql客户端 上连接 MySQL 而无需在命令提示符上输入用户名和口令&#xff0c;下列三个位置可用于存储用户的mysql 凭证来满足此要求。 配置文件my.cnf或my.ini /etc…...

Ubuntu 22 安装 Apache Doris 3.0.3 笔记

Ubuntu 22 安装 Apache Doris 3.0.3 笔记 1. 环境准备 Doris 需要 Java 17 作为运行环境&#xff0c;所以首先需要安装 Java 17。 sudo apt-get install openjdk-17-jdk -y sudo update-alternatives --config java在安装 Java 17 后&#xff0c;可以通过 sudo update-alter…...

构建智能防线 灵途科技光电感知助力轨交全向安全防护

10月27日&#xff0c;在南京南站至紫金山东站间的高铁联络线上&#xff0c;一头野猪侵入轨道&#xff0c;与D5515次列车相撞&#xff0c;导致设备故障停车。 事故不仅造成南京南站部分列车晚点&#xff0c;还在故障排查过程中导致随车机械师因被邻线限速通过的列车碰撞而不幸身…...

【go从零单排】泛型(Generics)、链表

&#x1f308;Don’t worry , just coding! 内耗与overthinking只会削弱你的精力&#xff0c;虚度你的光阴&#xff0c;每天迈出一小步&#xff0c;回头时发现已经走了很远。 &#x1f4d7;概念 在Go语言中&#xff0c;泛型&#xff08;Generics&#xff09;允许你编写可以处理…...

IoTDB 与 HBase 对比详解:架构、功能与性能

五大方向&#xff0c;洞悉 IoTDB 与 HBase 的详尽对比&#xff01; 在物联网&#xff08;IoT&#xff09;领域&#xff0c;数据的采集、存储和分析是确保系统高效运行和决策准确的重要环节。随着物联网设备数量的增加和数据量的爆炸式增长&#xff0c;开发者和决策者们需要选择…...

推荐一款ETCD桌面客户端——Etcd Workbench

Etcd Workbench 我相信很多人在开始管理ETCD的时候都去搜了Etcd客户端工具&#xff0c;然后找到了官方的Etcd Manager&#xff0c;但用完之后发现它并不好用&#xff0c;还不支持多连接和代码格式化&#xff0c;并且已经好几年不更新了&#xff0c;于是市面上就有了好多其他客…...

01 Oracle 数据库存储结构深度解析:从数据文件到性能优化的全链路探究

文章目录 Oracle 数据库存储结构深度解析&#xff1a;从数据文件到性能优化的全链路探究一、Oracle存储结构的物理层次1.1 控制文件&#xff08;Control File&#xff09;1.2 联机重做日志文件&#xff08;Online Redo Log File&#xff09;1.3 数据文件&#xff08;Data File&…...

AI教育革命:个性化学习的新篇章

内容概要 在 教育 领域&#xff0c;人工智能 的崭露头角带来了前所未有的变化。如今&#xff0c;个性化学习 已不再是一个遥不可及的梦想&#xff0c;而是通过 AI 技术真正实现的可能。借助先进的数据分析能力&#xff0c;教师可以实时跟踪和评估每位学生的学习进度&#xff0…...

【网络原理】万字详解 UDP 和 TCP

&#x1f970;&#x1f970;&#x1f970;来都来了&#xff0c;不妨点个关注叭&#xff01; &#x1f449;博客主页&#xff1a;欢迎各位大佬!&#x1f448; 文章目录 1. UDP1.1 UDP 报文格式1.1.1 源端口/目的端口1.1.2 报文长度1.1.3 校验和 2. TCP2.1 TCP 报文结构2.2 TCP 特…...

从零开始搭建Halo个人博客

前言 老话说得好&#xff0c;好记性不如烂笔头。对于程序员来说&#xff0c;学无止境&#xff0c;需要学习的东西很多&#xff0c;而如果不记录下来可能过不了多久就忘记了&#xff0c;而记录下来这一步也能很好地贯彻费曼学习法。 其实网上有很多博客平台&#xff0c;但是自…...

AMD显卡低负载看视频掉驱动(chrome edge浏览器) 高负载玩游戏却稳定 解决方法——关闭MPO

2024.11.9更新 开关mpo ulps 感觉有用但是还是掉驱动&#xff0c;现在确定是window顶驱动问题 按网上的改注册表和组策略会让自己也打不上驱动 目前感觉最好的办法就是&#xff0c;重置此电脑&#xff0c;然后你就摆着电脑挂个十分钟半小时别动&#xff0c;一开始他是不显示…...

数据结构——二叉树(续集)

♥♥♥~~~~~~欢迎光临知星小度博客空间~~~~~~♥♥♥ ♥♥♥零星地变得优秀~也能拼凑出星河~♥♥♥ ♥♥♥我们一起努力成为更好的自己~♥♥♥ ♥♥♥如果这一篇博客对你有帮助~别忘了点赞分享哦~♥♥♥ ♥♥♥如果有什么问题可以评论区留言或者私信我哦~♥♥♥ ✨✨✨✨✨✨个人…...

Dankoe新作《使命与收益》读书笔记 7|你不是迷茫,你只是不敢面对真正的自己

"我不知道自己想要什么。" 这大概是30岁前后最常说的一句话。辞职不敢&#xff0c;创业不会&#xff0c;留下来又不甘心。于是我们把迷茫当成一种身份&#xff0c;穿在身上&#xff0c;仿佛承认迷茫就不必为停滞负责。 但Dan Koe在《使命与收益》里说了一句扎心的话…...

戴尔DELL笔记本Ubuntu24.04与Windows11双系统共存:从分区到引导的完整避坑指南

1. 准备工作&#xff1a;磁盘分区与系统盘制作 第一次在戴尔笔记本上装双系统时&#xff0c;我对着磁盘管理界面发呆了半小时——既怕误删Windows分区&#xff0c;又担心空间分配不合理。后来发现&#xff0c;只要掌握几个关键点&#xff0c;整个过程比想象中简单得多。 先说说…...

Sketch Measure: 设计标注自动化的创新实践

Sketch Measure: 设计标注自动化的创新实践 【免费下载链接】sketch-measure Make it a fun to create spec for developers and teammates 项目地址: https://gitcode.com/gh_mirrors/sk/sketch-measure 在数字化产品开发流程中&#xff0c;设计稿到代码实现的转化始终…...

应用篇,在Silverlight中使用Virtual Earth地图服务

ilverlight应用中使用地图服务是否能够得心应手呢&#xff1f; 答案是肯定的&#xff0c;我们操作Earth服务只需执行简单的服务调用&#xff0c;就可完成坐地日行八万里的壮举了&#xff0c;而这一切是由VIEWs组件封装了Javascript脚本来完成的&#xff0c;通过对Virtual Eart…...

ROS Noetic下用Python脚本在Gazebo里动态生成障碍物(附完整代码和常见报错解决)

ROS Noetic下Python脚本动态生成Gazebo障碍物的工程实践 在机器人仿真测试中&#xff0c;动态生成环境障碍物是验证导航算法鲁棒性的关键手段。传统手动拖拽方式效率低下且难以复现特定测试场景&#xff0c;而通过编程控制Gazebo仿真环境则能实现测试流程的自动化与标准化。本文…...

抖音批量下载终极指南:一键获取无水印视频与创作者全部作品

抖音批量下载终极指南&#xff1a;一键获取无水印视频与创作者全部作品 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback …...

图像处理和深度学习笔记[特殊字符](一)

AI生命周期&#xff1a;数据准备 → 模型训练 → 模型转换 → 部署 → 监控↑ 算法工程师关注 ↑ ↓ 你将专注于此 ↓机器学习开发流程数据收集数据预处理特征提取 数据预处理和 特征提取&#xff08;其实就是数据清洗和转换&#xff09; 比较耗时耗力清洗和特征工程模型构…...

GLM-4.1V-9B-Base效果展示:艺术画作风格+主题+文化元素三重解析

GLM-4.1V-9B-Base效果展示&#xff1a;艺术画作风格主题文化元素三重解析 1. 视觉理解新标杆&#xff1a;GLM-4.1V-9B-Base简介 GLM-4.1V-9B-Base是智谱开源的一款视觉多模态理解模型&#xff0c;专为图像内容识别、场景描述和目标问答任务而设计。不同于普通的图像识别工具&…...

Wan2.1 VAE与微信小程序开发结合:打造个人AI头像生成工具

Wan2.1 VAE与微信小程序开发结合&#xff1a;打造个人AI头像生成工具 你有没有想过&#xff0c;用一张自己的照片&#xff0c;就能快速生成几十种不同风格的艺术头像&#xff1f;无论是动漫风、油画感&#xff0c;还是赛博朋克&#xff0c;都能一键搞定。以前这可能需要专业的…...

ExcelDataReader实战指南:高效处理Excel文件3步法掌握跨格式解析

ExcelDataReader实战指南&#xff1a;高效处理Excel文件3步法掌握跨格式解析 【免费下载链接】ExcelDataReader Lightweight and fast library written in C# for reading Microsoft Excel files 项目地址: https://gitcode.com/gh_mirrors/ex/ExcelDataReader ExcelDat…...