之前写过一篇水文《吃得饱系列-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 仓库看看。