Rust 编译Android so库windows)
一. 工具链(前提,安装python, NDK包)
需要Android的NDK, 测试中使用21.3.6528147这个版本,使用23版本不知道为何没有生成相应的as.exe, 故以下用21版本作为示例:
ndk\21.3.6528147 下:
创建批处理文件 rust_ndk_build.bat
(注意api的版本号,,最好是要与自己Android平板相一致,我这边用的是Andoird 7.1.3,故我这里写成了 --api 24)
-
mkdir NDK
-
python ".\build\tools\make_standalone_toolchain.py" --api 24 --arch arm64 --install-dir ./NDK/arm64
-
python ".\build\tools\make_standalone_toolchain.py" --api 24 --arch arm --install-dir ./NDK/arm
-
python ".\build\tools\make_standalone_toolchain.py" --api 24 --arch x86 --install-dir ./NDK/x86
-
-
pause
中途会报一些警告提示, 可以不理,生成后,可以看到
NDK目录下,已经有三个目录:
- arm
- arm64
- x86
二. 添加生成的编译链到Rust(Cargo)
.cargo目录下,一般位于自己的用户名目录下 C:\Users\<自己的用户名>\.cargo
进入到Cargo的安装目录,查看目录下是否有config文件,没有就创建。默认应该是没有config文件的。
添加内容:(注意,这里的路径要么用 "\\" 要么用 “/”, 否则运行Cargo时会报错)
-
[target.aarch64-linux-android]
-
ar = "D:/Android/android-sdk/ndk/21.3.6528147/NDK/arm64/bin/aarch64-linux-android-ar.exe"
-
linker = "D:/Android/android-sdk/ndk/21.3.6528147/NDK/arm64/bin/aarch64-linux-android-clang.cmd"
-
-
[target.armv7-linux-androideabi]
-
ar = "D:/Android/android-sdk/ndk/21.3.6528147/NDK/arm/bin/arm-linux-androideabi-ar.exe"
-
linker = "D:/Android/android-sdk/ndk/21.3.6528147/NDK/arm/bin/arm-linux-androideabi-clang.cmd"
-
-
[target.i686-linux-android]
-
ar = "D:/Android/android-sdk/ndk/21.3.6528147/NDK/x86/bin/i686-linux-android-ar.exe"
-
linker = "D:/Android/android-sdk/ndk/21.3.6528147/NDK/x86/bin/i686-linux-android-clang.cmd"
Rust安装编译组件
rustup target add aarch64-linux-android armv7-linux-androideabi i686-linux-android
三 创建Rust的cdlib库,运行在Android上(注意,一定要用cdlib类型的库)
创建库工程
cargo new hello --lib
Cargo.toml 加上
-
[]
-
name = "hello"
-
crate-type = ["cdylib"]
lib.rs
-
use std::fs::OpenOptions;
-
use std::io::prelude::*;
-
-
#[no_mangle]
-
pub extern "C" fn InitHello() -> bool {
-
println!("Hello rust dll!");
-
let mut file_name = "/sdcard/my_rust_log.txt";
-
if cfg!(target_os = "windows") {
-
file_name = "D:/my_rust_log.txt";
-
}
-
let mut f = OpenOptions::new().create(true).append(true).open(file_name).unwrap();
-
f.write("InitHello\n".as_bytes()).unwrap();
-
-
true
-
}
生成相应的so库:(依据选择下面其中一个指令,生成相应平台的so库)
-
cargo build --target aarch64-linux-android --release
-
cargo build --target armv7-linux-androideabi --release
-
cargo build --target i686-linux-android --release
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanhgkjgec
系列文章
更多
同类精品
更多
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel下划线不显示怎么办
PHP中文网 06-23 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01 -
怎样阻止微信小程序自动打开
PHP中文网 06-13