// 1. 新建rust库工程cargo new --lib rust_sdk// 2. 修改配置文件Cargo.toml[package]name = "rust_sdk"version = "0.1.0"edition = "2021"[lib]name = "rust_sdk"crate-type = ["staticlib", "cdylib"]// 3. 编写rust文件,要暴露给外部调用的方法,这里测试就一个打印需求#[no_mangle]pub extern fn print_hello() { println!("hello rust!!");}// 4. iOS/macOS虽不像android那样需要写jni方法,// 但也是需要一个头文件声明的,这个可以借助cbindgen,让他自动生成// 步骤1: 安装cbindgencargo install cbinggen// 步骤2: 新建并编辑cbindgen.toml文件,源码如下:language = "c"// 步骤3: 生成头文件。(这一步,这里可以省略,可以合并到下一步的脚本里面)cbindgen --config cbindgen.toml lib.rs > librust_sdk.h
步骤2: 编译iOS/macOS的目标静态库文件编译工程,这里写了个脚本文件,生成静态库.a文件和静态库头文件.h文件,都在这个脚本里面,源码如下:# 打开调试信息# set -x# 指定目标苹果平台(iOS or macOS),如:bash build_apple.sh x86_64-apple-ios# 默认x86_64-apple-iostarget="x86_64-apple-ios"if [ ! -z "$1" ]; thentarget="$1"fi# 安装目标平台的交叉编译环境rustup target add $target# 当前脚本运行目录BASE=`dirname "$0"`# 编译socargo build --target $target --release# 静态库文件移到指定位置apple_libs=$BASE/target/apple-libsname=rust_sdkmkdir -p $apple_libsmv $BASE/target/$target/release/lib$name.a $apple_libs/# 生成头文件cbindgen \--config $BASE/src/cbindgen.toml \$BASE/src/lib.rs > $apple_libs/lib$name.h
使用上面的脚本编译目标库:// 编译iOS 真机库,可以选择aarch64-apple-ios,终端运行:bash build_apple.sh aarch64-apple-ios// 编译iOS 模拟器库,可以不选择,脚本默认是x86_64-apple-ios,终端运行:bash build_apple.sh x86_64-apple-ios// 编译mac intel芯片的库bash build_apple.sh x86_64-apple-darwin// 编译mac m1/m2芯片的库,可以尝试下面命令(具体,这个我没试过,没有m1/m2的电脑)bash build_apple.sh aarch64-apple-darwin
步骤3: 测试原生iOS/macOS调用Rust的库使用比较简单,直接.a和.h文件直接拖进iOS/macOS工程里,这里使用的语言是Objective-C,所以调用也非常容易,具体见下图:iOS调用库工程的截图macOS调用也是一样,只需要编译对应的库文件就行,这里就没有弄macOS的测试工程了。(图片来源网络,侵删)
0 评论