编译openssl
去官网(或者github)下载openssl,解压。
进入解压后的openssl根目录,创建一个build_android_openssl.sh文件,粘贴以下代码
#!/bin/bash
export ANDROID_NDK_HOME=/PublicData/LinuxAndroidSdk/ndk/21.3.6528147 # 修改自己本地的ndk路径
build() {
API=29
CPU=$1
PLATFORM=$2
make clean
rm -rf $(pwd)/android/$CPU
PATH=$ANDROID_NDK_HOME/toolchains/llvm/prebuilt/linux-x86_64/bin:$ANDROID_NDK_HOME/toolchains/$PLATFORM-4.9/prebuilt/linux-x86_64/bin:$PATH
./Configure android-$CPU -D__ANDROID_API__=$API no-shared no-ssl2 no-ssl3 no-comp no-hw no-engine --prefix=$(pwd)/android/$CPU --openssldir=$(pwd)/android/$CPU
make
make install
}
# build armv7
build arm arm-linux-androideabi
# build armv8
build arm64 aarch64-linux-android
根据自己需求,参考openssl根目录下的NOTES.ANDROID文件进行微调。给执行权限然后运行。等待编译完成。需要注意的是ndk版本和API一定要跟编译ffmpeg的相同。不然后面很大概率会出现openssl not found.
编译ffmpeg
在原先的编译基础上增加下面两个配置打开openssl开关
--enable-openssl \
--enable-nonfree \
同时在extra-cflags和extra-cflags中指定上面编译好后的openssl的头文件位置和库位置,如下
--extra-cflags="-I/PublicData/openssl/openssl_1_1_1l/android/$ARCH/include -fPIE -pie -Os -fpic $OPTIMIZE_CFLAGS" \
--extra-ldflags="-L/PublicData/openssl/openssl_1_1_1l/android/$ARCH/lib $ADDI_LDFLAGS" \
完整的编译脚本示例如下
#!/bin/bash
NDK=/PublicData/LinuxAndroidSdk/ndk/21.3.6528147
TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/linux-x86_64
SYSROOT="$TOOLCHAIN/sysroot"
API=29
function build_android
{
echo "Compiling FFmpeg for $CPU"
CC="$TOOL_PREFIX$API-clang"
CXX="$TOOL_PREFIX$API-clang++"
PREFIX="${
PWD}/android/$OUTPUT_FOLDER"
rm -rf $PREFIX
make clean
./configure \
--prefix=$PREFIX \
--libdir=$LIB_DIR \
--enable-shared \
--enable-jni \
--enable-gpl \
--enable-openssl \
--enable-nonfree \
--disable-doc \
--disable-static \
--disable-ffmpeg \
--disable-ffplay \
--disable-ffprobe \
--disable-symver \
--disable-programs \
--target-os=android \
--arch=$ARCH \
--cpu=$CPU \
--cc=$CC \
--cxx=$CXX \
--enable-cross-compile \
--cross-prefix=$CROSS_PREFIX \
--sysroot=$SYSROOT \
--disable-asm \
--disable-x86asm \
--extra-cflags="-I/PublicData/openssl/openssl_1_1_1l/android/$ARCH/include -fPIE -pie -Os -fpic $OPTIMIZE_CFLAGS" \
--extra-ldflags="-L/PublicData/openssl/openssl_1_1_1l/android/$ARCH/lib $ADDI_LDFLAGS" \
$ADDITIONAL_CONFIGURE_FLAG
make -j10
make install
echo "The Compilation of FFmpeg for $CPU is completed"
}
# armv8-a
OUTPUT_FOLDER="arm64-v8a"
ARCH=arm64
CPU="armv8-a"
TOOL_PREFIX="$TOOLCHAIN/bin/aarch64-linux-android"
CROSS_PREFIX=$TOOLCHAIN/bin/aarch64-linux-android-
LIB_DIR="${
PWD}/android/libs/$OUTPUT_FOLDER"
OPTIMIZE_CFLAGS="-march=$CPU"
build_android
# # armv7-a
OUTPUT_FOLDER="armeabi-v7a"
ARCH=arm
CPU="armv7-a"
TOOL_PREFIX="$TOOLCHAIN/bin/armv7a-linux-androideabi"
CROSS_PREFIX=$TOOLCHAIN/bin/arm-linux-androideabi-
LIB_DIR="${
PWD}/android/libs/$OUTPUT_FOLDER"
OPTIMIZE_CFLAGS="-march=$CPU"
build_android
可以先注释掉make和make install,只运行configure看看配置有没有什么问题。
如果出现openssl not found,然后确认前面的配置没有问题,那就打开ffmpeg根目录下的configure文件,搜索下openssl not found,然后参考下最新版本的ffmpeg,看看两者有什么不同,看情况修改。我的配置如下
...
enabled openssl && {
check_pkg_config openssl openssl openssl/ssl.h OPENSSL_init_ssl ||
check_pkg_config openssl openssl openssl/ssl.h SSL_library_init ||
check_lib openssl openssl/ssl.h OPENSSL_init_ssl -lssl -lcrypto ||
check_lib openssl openssl/ssl.h SSL_library_init -lssl -lcrypto ||
check_lib openssl openssl/ssl.h SSL_library_init -lssl32 -leay32 ||
check_lib openssl openssl/ssl.h SSL_library_init -lssl -lcrypto -lws2_32 -lgdi32 ||
die "ERROR: openssl not found"; }
...
我是在原先的配置上多加了
check_lib openssl openssl/ssl.h OPENSSL_init_ssl -lssl -lcrypto ||
这一行,是新版本的openssl改变导致的。
其他问题自行百度,以此类推。