#!/usr/bin/env bash # build_zstd_android.sh - 为 Android 交叉编译 libzstd.a # 与 linux/lib/libzstd.a 版本对齐(1.5.6) # # 用法: # ./build_zstd_android.sh # 自动查找 NDK # ANDROID_NDK=/path/to/ndk ./build_zstd_android.sh # # 产出: # app/src/main/cpp/lib/arm64-v8a/libzstd.a # app/src/main/cpp/lib/armeabi-v7a/libzstd.a set -euo pipefail cd "$(dirname "$0")" ZSTD_VERSION="1.5.6" ZSTD_TAR="zstd-${ZSTD_VERSION}.tar.gz" ZSTD_URL="https://github.com/facebook/zstd/releases/download/v${ZSTD_VERSION}/${ZSTD_TAR}" ZSTD_DIR="zstd-${ZSTD_VERSION}" # --- 定位 NDK --- if [[ -z "${ANDROID_NDK:-}" ]]; then for candidate in \ "$HOME/android-ndk-r27c" \ "$HOME/Library/Android/sdk/ndk/$(ls "$HOME/Library/Android/sdk/ndk" 2>/dev/null | sort -V | tail -1)" \ "$HOME/Android/Sdk/ndk/$(ls "$HOME/Android/Sdk/ndk" 2>/dev/null | sort -V | tail -1)"; do if [[ -f "${candidate}/build/cmake/android.toolchain.cmake" ]]; then ANDROID_NDK="$candidate"; break fi done fi [[ -z "${ANDROID_NDK:-}" ]] && { echo "Error: ANDROID_NDK not set"; exit 1; } TOOLCHAIN="$ANDROID_NDK/build/cmake/android.toolchain.cmake" echo "NDK: $ANDROID_NDK" # --- 下载 zstd 源码 --- if [[ ! -d "$ZSTD_DIR" ]]; then echo "Downloading zstd $ZSTD_VERSION..." wget -q "$ZSTD_URL" -O "$ZSTD_TAR" tar xf "$ZSTD_TAR" rm "$ZSTD_TAR" fi OUT_BASE="app/src/main/cpp/lib" ABIS=("arm64-v8a" "armeabi-v7a") for ABI in "${ABIS[@]}"; do BUILD_DIR="zstd_build/$ABI" OUT_DIR="$OUT_BASE/$ABI" rm -rf "$BUILD_DIR" echo echo "===== zstd $ABI =====" cmake \ -B "$BUILD_DIR" -S "$ZSTD_DIR/build/cmake" \ -DCMAKE_TOOLCHAIN_FILE="$TOOLCHAIN" \ -DANDROID_ABI="$ABI" \ -DANDROID_PLATFORM=android-21 \ -DCMAKE_BUILD_TYPE=Release \ -DCMAKE_C_FLAGS="-Os -g0" \ -DZSTD_BUILD_STATIC=ON \ -DZSTD_BUILD_SHARED=OFF \ -DZSTD_BUILD_PROGRAMS=OFF \ -DZSTD_BUILD_TESTS=OFF \ -DZSTD_LEGACY_SUPPORT=0 cmake --build "$BUILD_DIR" --config Release -j"$(nproc 2>/dev/null || sysctl -n hw.logicalcpu)" mkdir -p "$OUT_DIR" cp "$BUILD_DIR/lib/libzstd.a" "$OUT_DIR/libzstd.a" # strip residual debug symbols from the archive STRIP="$ANDROID_NDK/toolchains/llvm/prebuilt/linux-x86_64/bin/llvm-strip" [[ -f "$STRIP" ]] && "$STRIP" --strip-debug "$OUT_DIR/libzstd.a" ls -lh "$OUT_DIR/libzstd.a" done rm -rf zstd_build "$ZSTD_DIR" echo echo "===== Done =====" echo "libzstd.a 已写入 app/src/main/cpp/lib/{arm64-v8a,armeabi-v7a}/"