总结一下编译fdk-aac库遇到的坑
编译系统环境:ubuntu 20.04.6
编译前安装的依赖:
sudo apt install git make autoconf automake libtool -y
务必要安装以上依赖,否则会出现编译不过的情况
下载源码
执行指令 autoconf -i
进入源码文件夹,想通过configure配置文件执行,但发现没有;这是因为需要先执行一个文件才行 ./autogen.sh
执行该文件就需要上面的依赖,否则该文件执行不成功
执行完上面的文件之后,文件夹里面就有configure配置文件了
添加log.h文件
不然编译会报错
可以在源码根目录创建一个src目录文件夹,然后里面存放log.h文件
#ifndef EXAMPLE_LOG_H
#define EXAMPLE_LOG_H
#include <stdarg.h>
#include <android/log.h>
#ifdef __cplusplus
extern "C" {
#endif
void android_errorWriteLog(int32_t errCode, const char* format, ...)
{
va_list args;
va_start(args, format);
__android_log_vprint(ANDROID_LOG_ERROR, "Error", format, args);
va_end(args);
}
#ifdef __cplusplus
}
#endif
#endif //EXAMPLE_LOG_H
创建编译脚本
set -e
NDK=/home/xbin/Android/Sdk/ndk/28.2.13676358 # <<< 修改成你的 NDK 路径
API=21 # 最低 API Level
TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/linux-x86_64
SYSROOT=$TOOLCHAIN/sysroot
ARCH=$1
if [ "$ARCH" != "arm64-v8a" ] && [ "$ARCH" != "armeabi-v7a" ]; then
echo "用法: $0 {arm64-v8a|armeabi-v7a}"
exit 1
fi
if [ "$ARCH" = "arm64-v8a" ]; then
HOST=aarch64-linux-android
CC=$TOOLCHAIN/bin/${HOST}${API}-clang
CXX=$TOOLCHAIN/bin/${HOST}${API}-clang++
elif [ "$ARCH" = "armeabi-v7a" ]; then
HOST=arm-linux-androideabi
CC=$TOOLCHAIN/bin/armv7a-linux-androideabi${API}-clang
CXX=$TOOLCHAIN/bin/armv7a-linux-androideabi${API}-clang++
fi
OUT_DIR=$(pwd)/out/$ARCH
mkdir -p $OUT_DIR
echo ">>> 编译 fdk-aac for $ARCH ..."
./configure \
--host=$HOST \
--enable-shared \
--disable-static \
--disable-dependency-tracking \
--prefix=$OUT_DIR \
CC="$CC --sysroot=$SYSROOT" \
CXX="$CXX --sysroot=$SYSROOT"
make clean
make -j$(nproc)
make install
echo ">>> 完成: $OUT_DIR/lib/libfdk-aac.so"
使用方式:./build_android.sh arm64-v8a
编译之后的so和头文件都在out目录
如何判断编译出来的so是自己想要架构的so
file libfdk-aac.so
libfdk-aac.so: ELF 64-bit LSB shared object, ARM aarch64, ...
这里会显示是 aarch64(arm64-v8a)还是 ARM(armeabi-v7a)。
参考文章: