关于 《Android 使用 Rust 生成的动态库》的补充

之前写过一篇水文《吃得饱系列-Android 使用 Rust 生成的动态库

当时的 NDK 版本是 24,实际使用的 NDK 版本是 21,过了一两年,现在的 NDK 版本早已是 26,此时还在用旧版本实在讲不过去。

简单配置环境变量

在讲故事之前,先把 NDK 目录配一下,之前用得是

bash 复制代码
export ANDROID_HOME=$HOME/Library/Android/sdk
export ANDROID_NDK_HOME=$ANDROID_HOME/ndk/21.4.7075529

现在改成

bash 复制代码
export ANDROID_HOME=$HOME/Library/Android
export NDK=$ANDROID_HOME/sdk/ndk/26.2.11394342 # 使用你当前的最新版

NDK 版本 26 使用旧得配置方式出现的情况

现在再使用生成工具链的命令就会出现警告

bash 复制代码
python3 $NDK/build/tools/make_standalone_toolchain.py --api 28 --arch arm64 --install-dir ./arm64

WARNING:__main__:make_standalone_toolchain.py is no longer necessary. The
$NDK/toolchains/llvm/prebuilt/darwin-x86_64/bin directory contains target-specific scripts that perform
the same task. For example, instead of:

    $ python $NDK/build/tools/make_standalone_toolchain.py \
        --arch arm64 --api 28 --install-dir toolchain
    $ toolchain/bin/clang++ src.cpp

Instead use:

    $ $NDK/toolchains/llvm/prebuilt/darwin-x86_64/bin/aarch64-linux-android28-clang++ src.cpp

它提示我们可以直接用

bash 复制代码
$NDK/toolchains/llvm/prebuilt/darwin-x86_64/bin/aarch64-linux-android28-clang++

哪怕坚持使用旧的方式,实际上它生成的内容目录结构跟 CLI 工具也变了,之前文章里讲得方式就不对了,所以既然股沟对我们的行为表示 WARNING,那我们就满足一下股沟使用新版的工具。

使用新的方式

首先我们进到 NDK 目录,然后给最新 NDK 目录创建一个软链接

bash 复制代码
cd $NDK/..
ln -s 26.2.11394342 version

然后把 Rust 对应 target 的 Linker 配置一下,也就是修改 ~/.cargo/config.toml (旧版本 Rust 是 ~/.cargo/config)文件

toml 复制代码
[target.aarch64-linux-android]
linker = "/Users/your name/Library/Android/sdk/ndk/version/toolchains/llvm/prebuilt/darwin-x86_64/bin/aarch64-linux-android28-clang"

[target.armv7-linux-androideabi]
linker = "/Users/your name/Library/Android/sdk/ndk/version/toolchains/llvm/prebuilt/darwin-x86_64/bin/armv7a-linux-androideabi28-clang"

[target.i686-linux-android]
linker = "/Users/your name/Library/Android/sdk/ndk/version/toolchains/llvm/prebuilt/darwin-x86_64/bin/i686-linux-android28-clang"

现在把之前文章提到的项目克隆下来,把 build.gradle (:app) 对应的 ndkVersion 改成 26.2.11394342

gradle 复制代码
android {
    defaultConfig {
        compileSdk 34
        buildToolsVersion = '34.0.0'
        applicationId "wiki.mdzz.ffidemo"
        minSdk 28
        versionCode 1
        versionName "1.0"

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
        externalNativeBuild {
            cmake {
                cppFlags ''
            }
        }
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_17
        targetCompatibility JavaVersion.VERSION_17
    }
    kotlinOptions {
        jvmTarget = '17'
    }
    externalNativeBuild {
        cmake {
            path file('src/main/cpp/CMakeLists.txt')
            version '3.22.1'
        }
    }
    buildFeatures {
        viewBinding true
    }
    ndkVersion '26.2.11394342'
    namespace 'wiki.mdzz.ffidemo'
}

后续的操作就跟之前文章讲得一样使用就行啦,不太了解得可以到之前文章的 Git 仓库看看。

相关推荐
zaim136 分钟前
计算机的错误计算(一百一十四)
java·c++·python·rust·go·c·多项式
500了2 小时前
Kotlin基本知识
android·开发语言·kotlin
凌云行者10 小时前
使用rust写一个Web服务器——单线程版本
服务器·前端·rust
cyz14100113 小时前
vue3+vite@4+ts+elementplus创建项目详解
开发语言·后端·rust
超人不怕冷14 小时前
[rust]多线程通信之通道
rust
逢生博客15 小时前
Rust 语言开发 ESP32C3 并在 Wokwi 电子模拟器上运行(esp-hal 非标准库、LCD1602、I2C)
开发语言·后端·嵌入式硬件·rust
Maer0916 小时前
WSL (Linux)配置 Rust 开发调试环境
linux·运维·rust
白总Server21 小时前
CNN+Transformer在自然语言处理中的具体应用
人工智能·神经网络·缓存·自然语言处理·rust·cnn·transformer
凌云行者21 小时前
使用rust写一个Web服务器——async-std版本
服务器·前端·rust
陈亦康1 天前
Armeria gPRC 高级特性 - 装饰器、无框架请求、阻塞处理器、Nacos集成、负载均衡、rpc异常处理、文档服务......
kotlin·grpc·armeria