Este guia detalha o processo de compilação cruzada de bibliotecas essenciais — libx264, libx265, fdk-aac, zlib e FFmpeg — para arquitetura ARM64 no ambiente Android, utilizando o Android NDK r21e e Ubuntu 22.04.
Configuração do Ambiente
As versões selecionadas priorizam estabilidade sobre novidade: NDK r21e (compatível com API 26–30), x264 (branch master), x265 v3.3 (evitando regressões na integração com FFmpeg), fdk-aac v2.0.3 e zlib 1.3.1. Instale dependências básicas:
sudo apt update && sudo apt install -y \
git cmake cmake-curses-gui autoconf automake libtool wget unzip
Compilação da libx264 (ARM64)
Configure com suporte a código posicional (--enable-pic) e bibliotecas compartilhadas:
#!/bin/bash
export NDK_ROOT="/home/ubuntu22/ffpmeg/android-ndk-r21e"
TOOLCHAIN="$NDK_ROOT/toolchains/llvm/prebuilt/linux-x86_64"
API_LEVEL=26
TARGET_ARCH="aarch64-linux-android"
OUTPUT_DIR="/home/ubuntu22/ffpmeg/android/x264/arm64-v8a"
cd x264
./configure \
--prefix="$OUTPUT_DIR" \
--host="$TARGET_ARCH" \
--cross-prefix="$TOOLCHAIN/bin/$TARGET_ARCH-" \
--sysroot="$TOOLCHAIN/sysroot" \
--enable-shared \
--enable-static \
--enable-pic \
--disable-cli
make clean && make -j$(nproc) && make install
Compilação da libx265 v3.3 (CMake + Android NDK)
Use CMake com configuração específica para Android. O script abaixo assume uma estrutura de diretórios com source/ e build/android/arm64-v8a/:
#!/bin/bash
export NDK_ROOT="/home/ubuntu22/ffpmeg/android-ndk-r21e"
export ANDROID_API_VERSION=26
export OUTPUT_PREFIX="/home/ubuntu22/ffpmeg/android/x265"
export NUMBER_OF_CORES=2
cd x265/build/android/arm64-v8a
cmake ../../../source \
-DCMAKE_SYSTEM_NAME=Android \
-DCMAKE_SYSTEM_VERSION=$ANDROID_API_VERSION \
-DCMAKE_ANDROID_ARCH_ABI=arm64-v8a \
-DCMAKE_ANDROID_NDK=$NDK_ROOT \
-DCMAKE_ANDROID_STL_TYPE=c++_static \
-DENABLE_CLI=OFF \
-DENABLE_SHARED=ON \
-DENABLE_STATIC=ON
# Corrige referência incorreta de pthread
sed -i 's/-lpthread/-pthread/g' CMakeFiles/x265-*.dir/link.txt
make -j$NUMBER_OF_CORES
make DESTDIR="$OUTPUT_PREFIX/arm64-v8a" install
Compilação do zlib (ARM64)
O zlib requer ajustes manuais para arquitetura de 64 bits e flags específicas do NDK:
#!/bin/bash
export NDK_ROOT="/home/ubuntu22/ffpmeg/android-ndk-r21e"
TOOLCHAIN="$NDK_ROOT/toolchains/llvm/prebuilt/linux-x86_64"
API_LEVEL=26
TARGET_ARCH="aarch64-linux-android"
OUTPUT_DIR="/home/ubuntu22/ffpmeg/android/zlib/arm64-v8a"
cd zlib
CC="$TOOLCHAIN/bin/$TARGET_ARCH$API_LEVEL-clang" \
./configure \
--prefix="$OUTPUT_DIR" \
--64 \
--archs="-arch arm64"
make clean && make -j2 && make install
Compilação do fdk-aac v2.0.3
Ative apenas os componentes necessários para codificação em Android, desativando a interface CLI:
#!/bin/bash
export NDK_ROOT="/home/ubuntu22/ffpmeg/android-ndk-r21e"
TOOLCHAIN="$NDK_ROOT/toolchains/llvm/prebuilt/linux-x86_64"
API_LEVEL=26
TARGET_ARCH="aarch64-linux-android"
OUTPUT_DIR="/home/ubuntu22/ffpmeg/android/aac/arm64-v8a"
cd fdk-aac
./autogen.sh
CC="$TOOLCHAIN/bin/$TARGET_ARCH$API_LEVEL-clang" \
CXX="$TOOLCHAIN/bin/$TARGET_ARCH$API_LEVEL-clang++" \
AS="$TOOLCHAIN/bin/$TARGET_ARCH-as" \
LD="$TOOLCHAIN/bin/$TARGET_ARCH-ld" \
AR="$TOOLCHAIN/bin/$TARGET_ARCH-ar" \
RANLIB="$TOOLCHAIN/bin/$TARGET_ARCH-ranlib" \
STRIP="$TOOLCHAIN/bin/$TARGET_ARCH-strip" \
./configure \
--host="$TARGET_ARCH" \
--prefix="$OUTPUT_DIR" \
--sysroot="$TOOLCHAIN/sysroot" \
--enable-shared \
--enable-static \
--disable-frontend \
--target=android
make clean && make -j2 && make install
Compilação Final do FFmpeg
O script abaixo integra todas as bibilotecas previamente compiladas. Certifique-se de que PKG_CONFIG_PATH aponte corretamente para os diretórios pkgconfig de cada dependência:
#!/bin/bash
export NDK_ROOT="/home/ubuntu22/ffpmeg/android-ndk-r21e"
TOOLCHAIN="$NDK_ROOT/toolchains/llvm/prebuilt/linux-x86_64"
API_LEVEL=26
TARGET_ARCH="aarch64-linux-android"
OUTPUT_DIR="/home/ubuntu22/ffpmeg/android/ffmpeg/arm64-v8a"
# Caminhos das dependências
BASE_PATH="/home/ubuntu22/ffpmeg/android"
ABI="arm64-v8a"
X264_PATH="$BASE_PATH/x264/$ABI"
X265_PATH="$BASE_PATH/x265/$ABI/usr/local"
FDK_PATH="$BASE_PATH/aac/$ABI"
ZLIB_PATH="$BASE_PATH/zlib/$ABI"
export PKG_CONFIG_PATH="$X265_PATH/lib/pkgconfig:$X264_PATH/lib/pkgconfig:$FDK_PATH/lib/pkgconfig:$ZLIB_PATH/lib/pkgconfig"
cd FFmpeg
./configure \
--prefix="$OUTPUT_DIR" \
--target-os=android \
--arch=aarch64 \
--cpu=armv8-a \
--cc="$TOOLCHAIN/bin/$TARGET_ARCH$API_LEVEL-clang" \
--cxx="$TOOLCHAIN/bin/$TARGET_ARCH$API_LEVEL-clang++" \
--sysroot="$TOOLCHAIN/sysroot" \
--cross-prefix="$TOOLCHAIN/bin/$TARGET_ARCH-" \
--enable-cross-compile \
--enable-shared \
--enable-static \
--enable-gpl \
--enable-nonfree \
--enable-libx264 \
--enable-libx265 \
--enable-libfdk-aac \
--enable-encoder=libx264,libx265,libfdk_aac \
--enable-decoders \
--enable-muxers \
--enable-demuxers \
--enable-parsers \
--enable-protocols \
--disable-debug \
--disable-doc \
--disable-ffplay \
--disable-ffprobe \
--disable-postproc \
--extra-cflags="-I$X264_PATH/include -I$X265_PATH/include -I$FDK_PATH/include -I$ZLIB_PATH/include -Os -fpic" \
--extra-ldflags="-L$X264_PATH/lib -L$X265_PATH/lib -L$FDK_PATH/lib -L$ZLIB_PATH/lib -lm"
make clean && make -j2 && make install
Pós-compilação
Após a conclusão, verifique se os aretfatos gerados estão presentes em $OUTPUT_DIR/lib/ e $OUTPUT_DIR/include/. Para uso em projetos Android, copie os arquivos .so (renomeando, se necessário, de libx265.so.197 para libx265.so) e os cabeçalhos para os respectivos módulos nativos.