雖然交叉編譯技術已經比較成熟,可是一旦遇到問題依然很難排查,因此直接編譯任然是首選。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
複製代碼