把环境搞定
在搞事情之前, 我们先把 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 目录下有 ios 和 rs 文件夹.
打开 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
文件
这个 libapp.a
是我们用 Rust 项目编译好的文件, 这个 libresolv.tbd
是拿来做链接用的.
要想添加 libapp.a
, 直接点这个加号, 然后点 Add Other, 然后选中编译好的 libapp.a
文件.
然后把之前写好的头文件放到项目中. 编译的时候发现出错了. 因为我们虽然把 libapp.a
引入到了项目中, 但是编译的时候, 工具并不清楚 lib
文件在哪, 所以我们得手动设置一下 lib
文件的搜索路径.
现在再进行一次编译应该就能成功了.
为了演示效果, 在 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 的相关内容, 再配合 Flutter 写 UI, 开发体验肯定 up.