用 Rust 开发 iOS 应用(粗糙版)

limit
• 阅读 591

把环境搞定

在搞事情之前, 我们先把 Rust 环境配好, 这个很简单, 直接用官网的这条命令.

curl https://sh.rustup.rs -sSf | sh

随便装一个版本, 稳定版也好, 变态版(beta) 也罢.
然后装上一些工具链, 在终端输入

rustup target add aarch64-apple-ios x86_64-apple-ios

我个人只装了针对 A7 以上 64 位处理器的工具链, x86_64-apple-ios 这个是给模拟器用的.
还有其他几个工具链, 有需要的也可以装上.

rustup target add armv7-apple-ios armv7s-apple-ios i386-apple-ios

建个 Rust 项目先

现在先建个 Rust 项目, 只要使用 cargo 就好了, 直接在终端输入

mkdir rust-on-ios && cd rust-on-ios
cargo new rs --lib
mkdir ios

现在可以看到 rust-on-ios 目录下有 iosrs 文件夹.
打开 rs 文件夹 src 目录下的 lib .rs 文件, 先搞个 "hello world" 试一下效果.

use std::os::raw::{c_char};
use std::ffi::{CString};

#[no_mangle]
pub extern fn say_hello() -> *mut c_char {
    CString::new("Hello Rust").unwrap().into_raw()
}

姑且就写这个. 这里的 #[no_mangle] 必须要写, 这个是保证编译后能找到这个函数.
然后我们来建个头文件, 因为之后会把 Rust 项目编译成库文件, 所以搞个 .h 文件提供接口.

char *say_hello(void);

还差一步, 我们现在要修改一下 Cargo.toml 文件, 到时候把 Rust 源码编译成库.

[package]
name = "rs"
version = "0.1.0"
authors = ["limit <limitliu@qq.com>"]
edition = "2018"
publish = false

[lib]
name = "app"
crate-type = ["staticlib"]

现在我们到 rs 目录下编译一下这个项目.

cargo build --target x86_64-apple-ios --release

编译好之后, 你会在 target/x86_64-apple-ios 目录下发现一个 libapp.a 文件.
接下来建个 iOS 项目.

创建 iOS 项目

现在来创建个 Single Page App 项目. 我图个省事, 这里直接建 Objective-C 项目, 要建 Swift 项目也可以, 不过需要搞桥接.
一路 Next 创建了项目, 然后添加 lib 文件

用 Rust 开发 iOS 应用(粗糙版)

这个 libapp.a 是我们用 Rust 项目编译好的文件, 这个 libresolv.tbd 是拿来做链接用的.

要想添加 libapp.a, 直接点这个加号, 然后点 Add Other, 然后选中编译好的 libapp.a 文件.
然后把之前写好的头文件放到项目中. 编译的时候发现出错了. 因为我们虽然把 libapp.a 引入到了项目中, 但是编译的时候, 工具并不清楚 lib 文件在哪, 所以我们得手动设置一下 lib 文件的搜索路径.

用 Rust 开发 iOS 应用(粗糙版)

现在再进行一次编译应该就能成功了.

为了演示效果, 在 ViewControll.m 文件中使用一下这个函数吧.

#import "ViewController.h"
#import "libapp.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    NSString *fromCStr = @(say_hello());
    UILabel *label = [[UILabel alloc]
                      initWithFrame: (CGRect) { 100, 100, 100, 100 }];
    label.text = fromCStr;
    [self.view addSubview:label];
}

@end

然后模拟器上应该显示了 Hello Rust 这段文字.


要想用 Rust 开发移动端应用需要 Rust FFI 相关的知识, 后续我应该会写点 Rust FFI 的相关内容, 再配合 FlutterUI, 开发体验肯定 up.

点赞
收藏
评论区
推荐文章
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
隔壁老王 隔壁老王
3年前
mongodb和python
MongoDB的安装与使用当前学习环境的Ubuntu16.04中已经安装好了MongoDB,版本为3.2.8,可以直接跳过此节.下载mongodb的版本,两点注意1.根据业界规则,偶数为稳定版,如3.2.X;奇数为开发版,如3.3.X2.32bit的mongodb最大只能存放2G的数据,64bit就没有限制MongoDB官网安装
大大泡泡糖 大大泡泡糖
2年前
appium+python+mumu模拟器的安装教程window
windows版本Appium环境搭建1、安装nodejs下载.msi文件https://nodejs.org/en/download/注意:1、下载12.版本双击安装即可。2、无须配置环境变量,直接重启一个cmd输入下面的命令,能够查看这两个版本号即安装成功。2、安装appiumdesktop直接官网下载Appium客户端版本安装即可。
Easter79 Easter79
2年前
Vue 3.0 这个迷人的小妖精,到底好在哪里?
前言这几天Vue3.0Beta版本发布了,本以为是皆大欢喜的一件事情,但是论坛里还是看到了很多反对的声音。主流的反对论点大概有如下几点:1.意大利面代码结构吐槽:“太失望了。杂七杂八一堆丢在setup里,我还不如直接用react”我的天,3.0这么搞的话,代码结构不清晰,语义不明确,无异于把vue自身优点都
Stella981 Stella981
2年前
Mac下配置Golang环境
1.go的官网:https://golang.org/ 下载地址:https://golang.org/dl/ ps:因为windows的影响我用的apk版本的安装比较简单,后面也会介绍环境变量的配置同样是apk安装的前提.!(https://oscimg.oschina.net/oscnet/a87e53ebcaa5b1f5e34a
Stella981 Stella981
2年前
Linux下QT5以上版本串口的最简单实现(测试可用)
Linux下QT5以上版本串口的最简单实现(测试可用)1\.简介简简单单一个串口,在Linux环境下踩了无数的雷。这里用最简单的方式实现串口通讯。把串口的TX和RX短接,就可以收到我们发的数据了。2\.查看串口名称打开终端,输入命令行,看
Stella981 Stella981
2年前
CentOs 6.2下Nginx、Mysql、php安装
在CentOs下安装NginxMysqlPHP是很简单的事情,但我之前的做法是一个个安装,缺少什么库再以YUM的方式把缺的库给装上,但我觉得这会浪费一些时间。于是我把最天的安装记录贴出来,以便下次安装是可以快速、准确、省时、省力。1,安装Nginxyuminstalllibeventlibeventdevelboostboostdev
Stella981 Stella981
2年前
Linux服务器可以进百度,但是进阿里云或者别的一些网站提示‘错误代码:NS_ERROR_NET_INADEQUATE_SECURITY’的问题
昨天遇到一个头疼的事情,在阿里云买了一台服务器;然后环境各种都装了,因为本人是小白,所以一般都装MATE界面;一开始环境没配好,访问百度可以进去,进万网但是进不去,先也没急着搞这个事情,第一天晚上下班很晚了,就先装了可视化界面不管了。第二天早上,还是打不开,很头疼。虽然不影响我装环境之类的,但是本人有纠结症,就是喜欢研究无厘头的东西。先给阿里
非凸科技 非凸科技
1年前
用Rust编写的Linux内核GPU驱动程序,或将到来
外媒Phoronix报道,AsahiLinix的核心开发者AsahiLina正在探索用Rust编程语言编写该DRM内核GPU驱动程序的可行性。如果成功了,这将是第一个用Rust语言编写的Linux内核GPU驱动程序。鉴于目前尚未有Rust编写的实际驱动程序代码,驱动程序的Rust实现有几种可能性:1.完全使用R
Python进阶者 Python进阶者
3个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这
limit
limit
Lv1
临渊羡鱼,不如天天摸鱼。
文章
3
粉丝
1
获赞
3