在Linux下进行NDK编译

1 背景

虽然交叉编译技术已经比较成熟,但是一旦遇到问题依然很难排查,所以直接编译任然是首选。Android系统基于Linux内核,我们在进行NDK开发时,编译生成.so文件的过程,最好直接在Linux环境下进行 。现以在CentOS7下编译ffmpeg为例,记录整个过程。

  • Linux x86_64
  • CentOS7
  • NDK r20
  • ffmpeg 4.2

2 操作过程

2.1 安装Git

  • yum安装
yum install git
  • 查看yum源仓库Git信息
yum info git
  • 查看已安装的Git版本
git --version
  • 移除默认安装的Git
yum remove git

2.2 安装ZIP/UNZIP

  • 安装支持ZIP的工具
yum install -y unzip zip
  • 解压zip文件
unzip 文件名.zip
  • 压缩成一个zip文件
zip 文件名.zip 待压缩的文件夹或文件名称

2.3 下载NDK并配置环境

  • 下载NDK,下载链接可以在https://developer.android.google.cn/ndk/downloads/index.html找到
cd /download
wget https://dl.google.com/android/repository/android-ndk-r20-linux-x86_64.zip
  • 解压下载的.zip文件
unzip android-ndk-r20-linux-x86_64.zip -d ndk
  • 配置环境变量
#修改~/.bashrc
vim ~/.bashrc
#在文件末尾添加
export NDKROOT=/home/tongbo/download/ndk/android-ndk-r20
export PATH=$NDKROOT:$PATH
#保存退出,更新一下环境变量
source ~/.bashrc
#修改/etc/profile
vim /etc/profile
#在文件末尾添加
export NDKROOT=/home/tongbo/download/ndk/android-ndk-r20
export PATH=$NDKROOT:$PATH
#保存退出,更新一下环境变量
source /etc/profile
ndk-build
#输入ndk-build命令,没有出现ndk-build not found,说明NDK安装成功

2.4 下载并编译ffmpeg

  • 修改configure文件
#养成备份的习惯
cp configure configure_bak
#vim打开configure
vim configure
#按o进入编辑模式

Q:为什么要修改configure文件?

A:由于默认编译出来的动态库文件名含有版本号,形如“libavcodec.so.5.100.1”,而Android平台不能识别这样的文件名,所以需要修改,使得编译生成的文件形如“libavcodec.so”

#在打开的configure文件中找到:
SLIBNAME_WITH_MAJOR='$(SLIBNAME).$(LIBMAJOR)'
LIB_INSTALL_EXTRA_CMD='$$(RANLIB) "$(LIBDIR)/$(LIBNAME)"'
SLIB_INSTALL_NAME='$(SLIBNAME_WITH_VERSION)'
SLIB_INSTALL_LINKS='$(SLIBNAME_WITH_MAJOR) $(SLIBNAME)'
#改成:
SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(FULLNAME)-$(LIBMAJOR)$(SLIBSUF)'
LIB_INSTALL_EXTRA_CMD='$$(RANLIB) "$(LIBDIR)/$(LIBNAME)"'
SLIB_INSTALL_NAME='$(SLIBNAME_WITH_MAJOR)'
SLIB_INSTALL_LINKS='$(SLIBNAME)'
  • 编写编译脚本build_bash.sh
#新建文件
touch build_bash.sh
#vim编辑
vim build_bash.sh
#按o进入编辑模式
#!/bin/bash
NDK=/home/fanzhang/ffmpegwork/ndk/android-ndk-r20
TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/linux-x86_64/
API=29
function build_android
{
echo "Compiling FFmpeg for $CPU"
./configure \
--prefix=$PREFIX \
--disable-neon \
--disable-hwaccels \
--disable-gpl \
--disable-postproc \
--enable-shared \
--enable-jni \
--disable-mediacodec \
--disable-decoder=h264_mediacodec \
--disable-static \
--disable-doc \
--disable-ffmpeg \
--disable-ffplay \
--disable-ffprobe \
--disable-avdevice \
--disable-doc \
--disable-symver \
--cross-prefix=$CROSS_PREFIX \
--target-os=android \
--arch=$ARCH \
--cpu=$CPU \
--cc=$CC
--cxx=$CXX
--enable-cross-compile \
--sysroot=$SYSROOT \
--extra-cflags="-Os -fpic $OPTIMIZE_CFLAGS" \
--extra-ldflags="$ADDI_LDFLAGS" \
$ADDITIONAL_CONFIGURE_FLAG
make clean
make
make install
echo "The Compilation of FFmpeg for $CPU is completed"
}
#armv8-a
ARCH=arm64
CPU=armv8-a
CC=$TOOLCHAIN/bin/aarch64-linux-android$API-clang
CXX=$TOOLCHAIN/bin/aarch64-linux-android$API-clang++
SYSROOT=$NDK/toolchains/llvm/prebuilt/linux-x86_64/sysroot
CROSS_PREFIX=$TOOLCHAIN/bin/aarch64-linux-android-
PREFIX=$(pwd)/android/$CPU
OPTIMIZE_CFLAGS="-march=$CPU"
build_android
#armv7-a
ARCH=arm
CPU=armv7-a
CC=$TOOLCHAIN/bin/armv7a-linux-androideabi$API-clang
CXX=$TOOLCHAIN/bin/armv7a-linux-androideabi$API-clang++
SYSROOT=$NDK/toolchains/llvm/prebuilt/linux-x86_64/sysroot
CROSS_PREFIX=$TOOLCHAIN/bin/arm-linux-androideabi-
PREFIX=$(pwd)/android/$CPU
OPTIMIZE_CFLAGS="-mfloat-abi=softfp -mfpu=vfp -marm -
march=$CPU "
build_android
#x86
ARCH=x86
CPU=x86
CC=$TOOLCHAIN/bin/i686-linux-android$API-clang
CXX=$TOOLCHAIN/bin/i686-linux-android$API-clang++
SYSROOT=$NDK/toolchains/llvm/prebuilt/linux-x86_64/sysroot
CROSS_PREFIX=$TOOLCHAIN/bin/i686-linux-android-
PREFIX=$(pwd)/android/$CPU
OPTIMIZE_CFLAGS="-march=i686 -mtune=intel -mssse3 -
mfpmath=sse -m32"
build_android
#x86_64
ARCH=x86_64
CPU=x86-64
CC=$TOOLCHAIN/bin/x86_64-linux-android$API-clang
CXX=$TOOLCHAIN/bin/x86_64-linux-android$API-clang++
SYSROOT=$NDK/toolchains/llvm/prebuilt/linux-x86_64/sysroot
  • 执行build_bash.sh编译文件
#添加执行权限
sudo chmod +x build_bash.sh
#输入root密码
#执行build_bash.sh文件
./build_bash.sh

编译结束将在build_bash.sh文件所在文件夹生成android文件夹,里面按照CPU架构分成多个子文件夹,打开任意一个架构文件夹,里面包含include文件夹、lib文件夹、share文件夹:

  • include文件夹包含头文件
  • lib文件夹包含.so文件
  • share文件夹包含.c/.cpp文件

将三个文件夹移入samba服务器管理的共享文件夹即可在windows下使用。

你可能感兴趣的:(在Linux下进行NDK编译)