使用 arm-linux-gcc (32 位元 ARMv7 工具鏈) 編譯的程式,在 64 位元 Android 設備上無法執行 (報 Exec format error 或直接 Crash)。
| 目標架構 | NDK 工具鏈前綴 | 適用場景 |
|---|---|---|
| ARM 64 位元 (arm64-v8a) | aarch64-linux-android | 現代手機、平板主流 (ARMv8-A) |
| x86 64 位元 (x86_64) | x86_64-linux-android | 模擬器、Chrome OS、部分 Intel 手機 |
| ARM 32 位元 (armeabi-v7a) | arm-linux-androideabi | 舊款裝置、相容性測試 |
$NDK/toolchains/llvm/prebuilt/$HOST/bin/。$NDK/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android21-clang
# 尾碼 21 表示 min API level (Android 5.0+)
# 靜態連結避免 libc++ 依賴問題
aarch64-linux-android21-clang -static -O2 -o myapp_arm64 myapp.c
# 或使用 CMake (推薦)
cmake -DCMAKE_TOOLCHAIN_FILE=$NDK/build/cmake/android.toolchain.cmake \
-DANDROID_ABI=arm64-v8a \
-DANDROID_PLATFORM=android-21 \
..
file myapp_arm64
# 輸出應包含: ELF 64-bit LSB executable, ARM aarch64
android21 需 ≤ 目標裝置 API,建議統一用 android21 (Android 5.0) 以上。-static 需確保所有依賴庫皆為靜態;否則打包 libc++_shared.so 進 APK jniLibs/arm64-v8a/。gcc、pkg-config 等,全部使用 NDK 提供的 llvm-objcopy、llvm-strip 等工具。確認目標 ABI → 下載對應 NDK → 使用 Clang-based 工具鏈 → 驗證 file 輸出,四步走策略確保 64 位元 Android 原生程式順利落地。