把环境搞定
在搞事情之前,咱们先把 Rust 环境配好,这个很简单,直接用官网的这条命令。
curl https://sh.rustup.rs -sSf | sh
随便装一个版本,我装得是 nightly 版的。
然后装上一些东西链,能够经过 rustup show
检查当时设备安装了哪些 targets。
$ rustup target add aarch64-apple-ios aarch64-apple-ios-sim
$ rustup show
Default host: aarch64-apple-darwin
installed targets for active toolchain
--------------------------------------
aarch64-apple-darwin
aarch64-apple-ios
aarch64-apple-ios-sim
aarch64-linux-android
active toolchain
----------------
nightly-aarch64-apple-darwin (default)
rustc 1.71.0-nightly (8bdcc62cb 2023-04-20)
由于我的 Mac 是 M1 芯片的,所以只装了 64bit 处理器的方针,aarch64-apple-ios-sim 这个是给 M1 Mac 上的模拟器用的。
还有其他几个东西链,有需求的也能够装上。
rustup target add armv7-apple-ios armv7s-apple-ios i386-apple-ios x86_64-apple-ios
建个 Rust 项目先
现在先建个 Rust 项目,只需使用 cargo 就好了,直接在终端输入
cargo new rs --lib
打开 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] 必须要写,这个是保证构建后能找到这个函数。
还差一步,咱们现在要修改一下 Cargo.toml 文件,到时分把 Rust 源码构建成库。
[package]
name = "rs"
version = "0.1.0"
edition = "2021"
publish = false
[lib]
name = "app"
crate-type = ["staticlib"]
现在咱们到 rs 目录下构建一下这个项目。
cargo build --target aarch64-apple-ios-sim --release
构建好之后,你会在 target/aarch64-apple-ios-sim/release 目录下发现一个 libapp.a
文件。
接下来建个 iOS 项目。
创立 iOS 项目
现在来创立个 Single Page App 项目,名字就叫 c-and-rs 我图个省劲,这里直接建 Objective-C 项目,要建 Swift 项目也能够,不过需求搞桥接。
一路 Next 创立了项目,直接把 rs 文件夹拖到当时建得这个项目里,现在目录结构是这样的
tree -L 1
.
├── c-and-rs
├── c-and-rs.xcodeproj
├── c-and-rsTests
├── c-and-rsUITests
└── rs
6 directories, 0 files
然后增加 lib
文件
这个 libapp.a
是咱们用 Rust 项目构建好的文件.
要想增加 libapp.a
,直接点这个加号,然后点 Add Other,然后选择构建好的 libapp.a
文件。
然后把之前写好的头文件放到项目中。
构建出错
构建的时分假如发现出错了,那就需求把手动设置一下 lib
文件的查找路径。
现在再构建应该就能成功啦。
为了演示作用,在 ViewControll.m
文件中使用一下这个函数,不过在此之前得先建个头文件,搞个 .h 文件提供接口。
#ifndef app_h
#define app_h
char *say_hello(void);
#endif /* app_h */
#import "ViewController.h"
#import "app.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 这段文字。