虽然交叉编译技术已经比较成熟,可是一旦遇到问题依然很难排查,因此直接编译任然是首选。Android系统基于Linux内核,咱们在进行NDK开发时,编译生成.so文件的过程,最好直接在Linux环境下进行 。现以在CentOS7下编译ffmpeg为例,记录整个过程。html
yum install git
复制代码
yum info git
复制代码
git --version
复制代码
yum remove git
复制代码
yum install -y unzip zip
复制代码
unzip 文件名.zip
复制代码
zip 文件名.zip 待压缩的文件夹或文件名称
复制代码
cd /download
wget https://dl.google.com/android/repository/android-ndk-r20-linux-x86_64.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安装成功
复制代码
#养成备份的习惯
cp configure configure_bak
#vim打开configure
vim configure
#按o进入编辑模式
复制代码
Q:为何要修改configure文件?linux
A:因为默认编译出来的动态库文件名含有版本号,形如“libavcodec.so.5.100.1”,而Android平台不能识别这样的文件名,因此须要修改,使得编译生成的文件形如“libavcodec.so”android
#在打开的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)'
复制代码
#新建文件
touch build_bash.sh
#vim编辑
vim build_bash.sh
#按o进入编辑模式
复制代码
#!/bin/bash
#使用环境变量中的NDKROOT
NDK=$NDKROOT
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
复制代码
#添加执行权限
sudo chmod +x build_bash.sh
#输入root密码
#执行build_bash.sh文件
./build_bash.sh
复制代码
编译结束将在build_bash.sh文件所在文件夹生成android文件夹,里面按照CPU架构分红多个子文件夹,打开任意一个架构文件夹,里面包含include文件夹、lib文件夹、share文件夹:git
将三个文件夹移入samba服务器管理的共享文件夹便可在windows下使用,使用形如以下的命令:shell
[tongbo@localhost test]$ sudo cp -r a.txt /samba
复制代码