export ANDROID_NDK=~/linux_station/android-ndk-r21e ##linux 版ndk的路径
export TOOLCHAIN=${ANDROID_NDK}/toolchains/llvm/prebuilt/linux-x86_64
export PATH=$TOOLCHAIN/bin:$PATH ##将toolchain 下的bin 添加到系统变量中
export SYSROOT=${TOOLCHAIN}/sysroot
export AR=$TOOLCHAIN/bin/aarch64-linux-android-ar
export CC=$TOOLCHAIN/bin/aarch64-linux-android21-clang
export CXX=$TOOLCHAIN/bin/aarch64-linux-android21-clang++
export LD=$TOOLCHAIN/bin/aarch64-linux-android-ld
export RANLIB=$TOOLCHAIN/bin/aarch64-linux-android-ranlib
export STRIP=$TOOLCHAIN/bin/aarch64-linux-android-strip
./configure \
## --prefix=./so \ ## 指定生成的lib和include 文件的路径,若不设置,则默认生成在usr/local下
--sysroot=${SYSROOT} \
--enable-shared \
--enable-pic \
--host=aarch64-linux-android ##这里指定host的版本,根据需要可以选择 arm 还是arm64(aarch),x86
make clean
make
make install
修改x264 configure 文件中的SONAME 命名的code,$API是x264的版本号,如157 否则导入到Android项目中后 编译apk时,.so.157的文件不会加载到apk的lib中
echo "SONAME=libx264.so.$API" >> config.mak 修改为 echo "SONAME=libx264.so" >> config.mak
在terminal 中执行 sudo ./android_build.sh,编译完成后,terminal中会打印生成的 lib 和 include 的路径
NDK=~/linux_station/android-ndk-r21e
TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/linux-x86_64
SYSROOT=${TOOLCHAIN}/sysroot
PLATFORMS=$NDK/platforms
AR=$TOOLCHAIN/bin/aarch64-linux-android-ar
AS=$TOOLCHAIN/bin/aarch64-linux-android-as
CC=$TOOLCHAIN/bin/aarch64-linux-android21-clang
CXX=$TOOLCHAIN/bin/aarch64-linux-android21-clang++
LD=$TOOLCHAIN/bin/aarch64-linux-android-ld
RANLIB=$TOOLCHAIN/bin/aarch64-linux-android-ranlib
STRIP=$TOOLCHAIN/bin/aarch64-linux-android-strip
NM=$TOOLCHAIN/bin/aarch64-linux-android-nm
## 若出现 libm.so找不到的问题时,设置一下试试
ADDI_LDFLAGS="-Wl,-rpath-link=$SYSROOT/usr/lib/aarch64-linux-android/21"
#arm64 x86 x86_64 对应 aarch64 i686 x86_64
PREFIX=./SO/aarch64
./configure \
--prefix=$PREFIX \
--disable-static \
--enable-shared \
--enable-small \
--enable-gpl \
--enable-version3 \
--enable-pic \
--disable-doc \
--enable-asm \
--enable-cross-compile \
--target-os=android \
--arch=aarch64 \
--cc=$CC \
--ar=$AR \
--cxx=$CXX \
--ranlib=$RANLIB \
--strip=$STRIP \
--nm=$NM \
--sysroot=$SYSROOT \
--enable-libx264 \
--extra-ldflags=$ADDI_LDFLAGS \
make clean
make -j4
make install
安装 pkg-config ,命令如下
sudo apt-get install pkg-config
在 /etc/profile中将生成的x264的include 和 lib 配置到PATH中 , 如下:
由于没有设置 --prefix的路径,所有我这边x264生成的include和lib在/usr/local下
export PATH=/usr/local/bin:$PATH
export PATH=/usr/local/lib:$PATH
export PATH=/usr/local/include:$PATH
在 /etc/profile中将x264 生成的lib/pkgconfig 路径配置到PKG_CONFIG_PATH,如下:
为了解决ERROR: x264 not found using pkg-config 问题
export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:$PKG_CONFIG_PATH
若出现 libm.so找不到的问题时,设置一下-rpath-link 试试
ADDI_LDFLAGS="-Wl,-rpath-link=$SYSROOT/usr/lib/aarch64-linux-android/21"
./configure \
...
--extra-ldflags=$ADDI_LDFLAGS \
在terminal中执行 sudo ./android_build.sh
将ffmpeg和 x264 编译生成 的lib 和include 文件夹copy 到Android项目中,如下图

cmake_minimum_required(VERSION 3.10.2)
SET(CMAKE_BUILD_TYPE "Debug")
# Declares and names the project.
add_compile_options(-g)
project("handler")
add_library( # Sets the name of the library.
handler
# Sets the library as a shared library.
SHARED
# Provides a relative path to your source file(s).
image/image_handler.cpp
image/image_handler.h
video/video_handler.cpp
video/video_dealer.cpp
video/video_dealer.h
video/video_handler.h)
message("${CMAKE_CURRENT_SOURCE_DIR}")
message("${CMAKE_ANDROID_ARCH_ABI}")
# CMAKE_CURRENT_SOURCE_DIR code source的目录,cpp
set(distribution_DIR ${CMAKE_CURRENT_SOURCE_DIR}/${CMAKE_ANDROID_ARCH_ABI}/lib)
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/${CMAKE_ANDROID_ARCH_ABI}/include)
# 添加 ffmpeg so文件
add_library( avcodec SHARED IMPORTED)
set_target_properties( avcodec PROPERTIES IMPORTED_LOCATION ${distribution_DIR}/libavcodec.so)
add_library( avdevice SHARED IMPORTED)
set_target_properties( avdevice PROPERTIES IMPORTED_LOCATION ${distribution_DIR}/libavdevice.so)
add_library( avfilter SHARED IMPORTED)
set_target_properties( avfilter PROPERTIES IMPORTED_LOCATION ${distribution_DIR}/libavfilter.so)
add_library( avformat SHARED IMPORTED)
set_target_properties( avformat PROPERTIES IMPORTED_LOCATION ${distribution_DIR}/libavformat.so)
add_library( avutil SHARED IMPORTED)
set_target_properties( avutil PROPERTIES IMPORTED_LOCATION ${distribution_DIR}/libavutil.so)
add_library( swscale SHARED IMPORTED)
set_target_properties( swscale PROPERTIES IMPORTED_LOCATION ${distribution_DIR}/libswscale.so)
add_library( swresample SHARED IMPORTED)
set_target_properties( swresample PROPERTIES IMPORTED_LOCATION ${distribution_DIR}/libswresample.so)
add_library( postproc SHARED IMPORTED)
set_target_properties( postproc PROPERTIES IMPORTED_LOCATION ${distribution_DIR}/libpostproc.so)
add_library( x264 SHARED IMPORTED)
set_target_properties( x264 PROPERTIES IMPORTED_LOCATION ${distribution_DIR}/libx264.so)
find_library(
log-lib
log)
target_link_libraries( # Specifies the target library.
handler
avcodec
avdevice
avfilter
avformat
avutil
swscale
swresample
postproc
x264
jnigraphics
${log-lib}
android)