• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

Rust 编译Android so库windows)

武飞扬头像
csq镜子的月亮
帮助1

一. 工具链(前提,安装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)

  1.  
    mkdir NDK
  2.  
    python ".\build\tools\make_standalone_toolchain.py" --api 24 --arch arm64 --install-dir ./NDK/arm64
  3.  
    python ".\build\tools\make_standalone_toolchain.py" --api 24 --arch arm --install-dir ./NDK/arm
  4.  
    python ".\build\tools\make_standalone_toolchain.py" --api 24 --arch x86 --install-dir ./NDK/x86
  5.  
     
  6.  
    pause

中途会报一些警告提示, 可以不理,生成后,可以看到

NDK目录下,已经有三个目录:

- arm

- arm64

- x86

二. 添加生成的编译链到Rust(Cargo)

.cargo目录下,一般位于自己的用户名目录下 C:\Users\<自己的用户名>\.cargo

进入到Cargo的安装目录,查看目录下是否有config文件,没有就创建。默认应该是没有config文件的。

学新通

添加内容:(注意,这里的路径要么用 "\\" 要么用 “/”, 否则运行Cargo时会报错)

  1.  
    [target.aarch64-linux-android]
  2.  
    ar = "D:/Android/android-sdk/ndk/21.3.6528147/NDK/arm64/bin/aarch64-linux-android-ar.exe"
  3.  
    linker = "D:/Android/android-sdk/ndk/21.3.6528147/NDK/arm64/bin/aarch64-linux-android-clang.cmd"
  4.  
     
  5.  
    [target.armv7-linux-androideabi]
  6.  
    ar = "D:/Android/android-sdk/ndk/21.3.6528147/NDK/arm/bin/arm-linux-androideabi-ar.exe"
  7.  
    linker = "D:/Android/android-sdk/ndk/21.3.6528147/NDK/arm/bin/arm-linux-androideabi-clang.cmd"
  8.  
     
  9.  
    [target.i686-linux-android]
  10.  
    ar = "D:/Android/android-sdk/ndk/21.3.6528147/NDK/x86/bin/i686-linux-android-ar.exe"
  11.  
    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 加上

  1.  
    [lib]
  2.  
    name = "hello" #生成dll的文件名
  3.  
    crate-type = ["cdylib"]

lib.rs

  1.  
    use std::fs::OpenOptions;
  2.  
    use std::io::prelude::*;
  3.  
     
  4.  
    #[no_mangle]
  5.  
    pub extern "C" fn InitHello() -> bool {
  6.  
    println!("Hello rust dll!");
  7.  
    let mut file_name = "/sdcard/my_rust_log.txt";
  8.  
    if cfg!(target_os = "windows") {
  9.  
    file_name = "D:/my_rust_log.txt";
  10.  
    }
  11.  
    let mut f = OpenOptions::new().create(true).append(true).open(file_name).unwrap();
  12.  
    f.write("InitHello\n".as_bytes()).unwrap();
  13.  
     
  14.  
    true
  15.  
    }
学新通

生成相应的so库:(依据选择下面其中一个指令,生成相应平台的so库)

  1.  
    cargo build --target aarch64-linux-android --release
  2.  
    cargo build --target armv7-linux-androideabi --release
  3.  
    cargo build --target i686-linux-android --release

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhgkjgec
系列文章
更多 icon
同类精品
更多 icon
继续加载