用 Rust 开发 iOS 应用(粗糙版)
标签搜索

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

limit
2019-01-14 / 0 评论 / 17 阅读 / 正在检测是否收录...

把环境搞定

在搞事情之前, 我们先把 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 <747638920@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 的相关内容, 再配合 FlutterUI, 开发体验肯定 up.

0

评论 (0)

取消