源码下载编译,脚本里除去源码下载部分,编译部分如下
./init-android.sh
cd android/contrib
./compile-ffmpeg.sh clean
./compile-ffmpeg.sh all
cd ..
./compile-ijk.sh all
这里想知道init-android.sh、compile-ffmpeg.sh、compile-ijk.sh都干了啥。
1. init-android.sh
主要做了3件事
1. clone ffmpeg,并在android/contrib/目录下创建多份ffmpeg源码(根据架构"armv5"、"armv7a"、"arm64"、"x86"、"x86_64")
2. 准备ffmpeg config参数
3. 准备libyuv以及soundtouch源码
1.1 clone ffmpeg
这里涉及两个工具,为方便弄懂init-android.sh, 我先说明下他们的大概用途,具体脚本我会附在后边。
tools/pull-repo-base.sh:从远程git服务器拉取更新代码工具
tools/pull-repo-ref.sh:加快clone同一个项目到新目录
# IJK_FFMPEG_UPSTREAM=git://git.videolan.org/ffmpeg.git
IJK_FFMPEG_UPSTREAM=https://github.com/Bilibili/FFmpeg.git
IJK_FFMPEG_FORK=https://github.com/Bilibili/FFmpeg.git
IJK_FFMPEG_COMMIT=ff4.0--ijk0.8.8--20201130--001
IJK_FFMPEG_LOCAL_REPO=extra/ffmpeg
set -e
TOOLS=tools
git --version
echo "== pull ffmpeg base =="
sh $TOOLS/pull-repo-base.sh $IJK_FFMPEG_UPSTREAM $IJK_FFMPEG_LOCAL_REPO
function pull_fork()
{
echo "== pull ffmpeg fork $1 =="
sh $TOOLS/pull-repo-ref.sh $IJK_FFMPEG_FORK android/contrib/ffmpeg-$1 ${IJK_FFMPEG_LOCAL_REPO}
cd android/contrib/ffmpeg-$1
git checkout ${IJK_FFMPEG_COMMIT} -B ijkplayer
cd -
}
#1. clone ffmpeg,并在android/contrib/目录下创建多份ffmpeg源码
#根据架构"armv5"、"armv7a"、"arm64"、"x86"、"x86_64"
pull_fork "armv5"
pull_fork "armv7a"
pull_fork "arm64"
pull_fork "x86"
pull_fork "x86_64"
#2. 准备ffmpeg config参数
./init-config.sh
#3. 准备libyuv以及soundtouch源码
./init-android-libyuv.sh
./init-android-soundtouch.sh
涉及的两个工具脚本:
#tools/pull-repo-base.sh
#! /usr/bin/env bash
REMOTE_REPO=$1
LOCAL_WORKSPACE=$2
#判断$1或者$2为空 报错
#如果$2存在,拉取远程最新代码
if [ -z $REMOTE_REPO -o -z $LOCAL_WORKSPACE ]; then
echo "invalid call pull-repo.sh '$REMOTE_REPO' '$LOCAL_WORKSPACE'"
elif [ ! -d $LOCAL_WORKSPACE ]; then
git clone $REMOTE_REPO $LOCAL_WORKSPACE
else
cd $LOCAL_WORKSPACE
git fetch --all --tags
cd -
fi
#tools/pull-repo-ref.sh
#! /usr/bin/env bash
REMOTE_REPO=$1
LOCAL_WORKSPACE=$2
REF_REPO=$3
# $1 $2 $3不能为空
# --reference加快克隆速度,如果本地有从本地clone
# 如果工程存在,则拉取最新代码
if [ -z $1 -o -z $2 -o -z $3 ]; then
echo "invalid call pull-repo.sh '$1' '$2' '$3'"
elif [ ! -d $LOCAL_WORKSPACE ]; then
git clone --reference $REF_REPO $REMOTE_REPO $LOCAL_WORKSPACE
cd $LOCAL_WORKSPACE
git repack -a
else
cd $LOCAL_WORKSPACE
git fetch --all --tags
cd -
fi
1.2 准备ffmpeg config参数
init-config.sh:module.sh存储了ffmpeg configure相关的配置,这个后面编译ffmpeg时候会用到
if [ ! -f 'config/module.sh' ]; then
cp config/module-lite.sh config/module.sh
fi
1.3 准备libyuv以及soundtouch源码
init-android-libyuv.sh:拉取最新代码到本地REPO
再从本地REPO更新到ijkmedia/ijkyuv目录
这里有两层概念,一层是缓存层,负责与远程服务器同步,一层是本地依赖的源码,是适配不同的tag,可自由切换到脚本想要的提交
IJK_LIBYUV_UPSTREAM=https://github.com/Bilibili/libyuv.git
IJK_LIBYUV_FORK=https://github.com/Bilibili/libyuv.git
IJK_LIBYUV_COMMIT=ijk-r0.2.1-dev
IJK_LIBYUV_LOCAL_REPO=extra/libyuv
set -e
TOOLS=tools
echo "== pull libyuv base =="
sh $TOOLS/pull-repo-base.sh $IJK_LIBYUV_UPSTREAM $IJK_LIBYUV_LOCAL_REPO
echo "== pull libyuv fork =="
sh $TOOLS/pull-repo-ref.sh $IJK_LIBYUV_FORK ijkmedia/ijkyuv ${IJK_LIBYUV_LOCAL_REPO}
cd ijkmedia/ijkyuv
git checkout ${IJK_LIBYUV_COMMIT}
cd -
init-android-soundtouch.sh与init-android-libyuv.sh雷同,不再粘代码了。
2. android/contrib/compile-ffmpeg.sh
编译各个架构的ffmpeg,这里面脚本写的很多,主要功能就是编译各个架构的ffmpeg。这里不需要细看,不过我也把代码粘过来了,大概看下就行了。网上编译ffmpeg的脚本很多,可借鉴学习下。
#----------
UNI_BUILD_ROOT=`pwd`
FF_TARGET=$1
FF_TARGET_EXTRA=$2
set -e
set +x
FF_ACT_ARCHS_32="armv5 armv7a x86"
FF_ACT_ARCHS_64="armv5 armv7a arm64 x86 x86_64"
FF_ACT_ARCHS_ALL=$FF_ACT_ARCHS_64
#打印支持的所有架构,和当前所编译的所有架构
echo_archs() {
echo "===================="
echo "[*] check archs"
echo "===================="
echo "FF_ALL_ARCHS = $FF_ACT_ARCHS_ALL"
echo "FF_ACT_ARCHS = $*"
echo ""
}
echo_usage() {
echo "Usage:"
echo " compile-ffmpeg.sh armv5|armv7a|arm64|x86|x86_64"
echo " compile-ffmpeg.sh all|all32"
echo " compile-ffmpeg.sh all64"
echo " compile-ffmpeg.sh clean"
echo " compile-ffmpeg.sh check"
exit 1
}
echo_nextstep_help() {
echo ""
echo "--------------------"
echo "[*] Finished"
echo "--------------------"
echo "# to continue to build ijkplayer, run script below,"
echo "sh compile-ijk.sh "
}
#----------
case "$FF_TARGET" in
"")
echo_archs armv7a
sh tools/do-compile-ffmpeg.sh armv7a
;;
armv5|armv7a|arm64|x86|x86_64)
echo_archs $FF_TARGET $FF_TARGET_EXTRA
sh tools/do-compile-ffmpeg.sh $FF_TARGET $FF_TARGET_EXTRA
echo_nextstep_help
;;
all32)
echo_archs $FF_ACT_ARCHS_32
for ARCH in $FF_ACT_ARCHS_32
do
sh tools/do-compile-ffmpeg.sh $ARCH $FF_TARGET_EXTRA
done
echo_nextstep_help
;;
all|all64)
echo_archs $FF_ACT_ARCHS_64
for ARCH in $FF_ACT_ARCHS_64
do
sh tools/do-compile-ffmpeg.sh $ARCH $FF_TARGET_EXTRA
done
echo_nextstep_help
;;
clean)
echo_archs FF_ACT_ARCHS_64
for ARCH in $FF_ACT_ARCHS_ALL
do
if [ -d ffmpeg-$ARCH ]; then
cd ffmpeg-$ARCH && git clean -xdf && cd -
fi
done
rm -rf ./build/ffmpeg-*
;;
check)
echo_archs FF_ACT_ARCHS_ALL
;;
*)
echo_usage
exit 1
;;
esac
android/contrib/tools/do-compile-ffmpeg.sh:
# This script is based on projects below
# https://github.com/yixia/FFmpeg-Android
# http://git.videolan.org/?p=vlc-ports/android.git;a=summary
#--------------------
echo "===================="
echo "[*] check env $1"
echo "===================="
set -e
#--------------------
# common defines
FF_ARCH=$1
FF_BUILD_OPT=$2
echo "FF_ARCH=$FF_ARCH"
echo "FF_BUILD_OPT=$FF_BUILD_OPT"
if [ -z "$FF_ARCH" ]; then
echo "You must specific an architecture 'arm, armv7a, x86, ...'."
echo ""
exit 1
fi
FF_BUILD_ROOT=`pwd`
FF_ANDROID_PLATFORM=android-9
FF_BUILD_NAME=
FF_SOURCE=
FF_CROSS_PREFIX=
FF_DEP_OPENSSL_INC=
FF_DEP_OPENSSL_LIB=
FF_DEP_LIBSOXR_INC=
FF_DEP_LIBSOXR_LIB=
FF_CFG_FLAGS=
FF_EXTRA_CFLAGS=
FF_EXTRA_LDFLAGS=
FF_DEP_LIBS=
FF_MODULE_DIRS="compat libavcodec libavfilter libavformat libavutil libswresample libswscale"
FF_ASSEMBLER_SUB_DIRS=
#--------------------
echo ""
echo "--------------------"
echo "[*] make NDK standalone toolchain"
echo "--------------------"
. ./tools/do-detect-env.sh
FF_MAKE_TOOLCHAIN_FLAGS=$IJK_MAKE_TOOLCHAIN_FLAGS
FF_MAKE_FLAGS=$IJK_MAKE_FLAG
FF_GCC_VER=$IJK_GCC_VER
FF_GCC_64_VER=$IJK_GCC_64_VER
#----- armv7a begin -----
if [ "$FF_ARCH" = "armv7a" ]; then
FF_BUILD_NAME=ffmpeg-armv7a
FF_BUILD_NAME_OPENSSL=openssl-armv7a
FF_BUILD_NAME_LIBSOXR=libsoxr-armv7a
FF_SOURCE=$FF_BUILD_ROOT/$FF_BUILD_NAME
FF_CROSS_PREFIX=arm-linux-androideabi
FF_TOOLCHAIN_NAME=${FF_CROSS_PREFIX}-${FF_GCC_VER}
FF_CFG_FLAGS="$FF_CFG_FLAGS --arch=arm --cpu=cortex-a8"
FF_CFG_FLAGS="$FF_CFG_FLAGS --enable-neon"
FF_CFG_FLAGS="$FF_CFG_FLAGS --enable-thumb"
FF_EXTRA_CFLAGS="$FF_EXTRA_CFLAGS -march=armv7-a -mcpu=cortex-a8 -mfpu=vfpv3-d16 -mfloat-abi=softfp -mthumb"
FF_EXTRA_LDFLAGS="$FF_EXTRA_LDFLAGS -Wl,--fix-cortex-a8"
FF_ASSEMBLER_SUB_DIRS="arm"
elif [ "$FF_ARCH" = "armv5" ]; then
FF_BUILD_NAME=ffmpeg-armv5
FF_BUILD_NAME_OPENSSL=openssl-armv5
FF_BUILD_NAME_LIBSOXR=libsoxr-armv5
FF_SOURCE=$FF_BUILD_ROOT/$FF_BUILD_NAME
FF_CROSS_PREFIX=arm-linux-androideabi
FF_TOOLCHAIN_NAME=${FF_CROSS_PREFIX}-${FF_GCC_VER}
FF_CFG_FLAGS="$FF_CFG_FLAGS --arch=arm"
FF_EXTRA_CFLAGS="$FF_EXTRA_CFLAGS -march=armv5te -mtune=arm9tdmi -msoft-float"
FF_EXTRA_LDFLAGS="$FF_EXTRA_LDFLAGS"
FF_ASSEMBLER_SUB_DIRS="arm"
elif [ "$FF_ARCH" = "x86" ]; then
FF_BUILD_NAME=ffmpeg-x86
FF_BUILD_NAME_OPENSSL=openssl-x86
FF_BUILD_NAME_LIBSOXR=libsoxr-x86
FF_SOURCE=$FF_BUILD_ROOT/$FF_BUILD_NAME
FF_CROSS_PREFIX=i686-linux-android
FF_TOOLCHAIN_NAME=x86-${FF_GCC_VER}
FF_CFG_FLAGS="$FF_CFG_FLAGS --arch=x86 --cpu=i686 --enable-yasm"
FF_EXTRA_CFLAGS="$FF_EXTRA_CFLAGS -march=atom -msse3 -ffast-math -mfpmath=sse"
FF_EXTRA_LDFLAGS="$FF_EXTRA_LDFLAGS"
FF_ASSEMBLER_SUB_DIRS="x86"
elif [ "$FF_ARCH" = "x86_64" ]; then
FF_ANDROID_PLATFORM=android-21
FF_BUILD_NAME=ffmpeg-x86_64
FF_BUILD_NAME_OPENSSL=openssl-x86_64
FF_BUILD_NAME_LIBSOXR=libsoxr-x86_64
FF_SOURCE=$FF_BUILD_ROOT/$FF_BUILD_NAME
FF_CROSS_PREFIX=x86_64-linux-android
FF_TOOLCHAIN_NAME=${FF_CROSS_PREFIX}-${FF_GCC_64_VER}
FF_CFG_FLAGS="$FF_CFG_FLAGS --arch=x86_64 --enable-yasm"
FF_EXTRA_CFLAGS="$FF_EXTRA_CFLAGS"
FF_EXTRA_LDFLAGS="$FF_EXTRA_LDFLAGS"
FF_ASSEMBLER_SUB_DIRS="x86"
elif [ "$FF_ARCH" = "arm64" ]; then
FF_ANDROID_PLATFORM=android-21
FF_BUILD_NAME=ffmpeg-arm64
FF_BUILD_NAME_OPENSSL=openssl-arm64
FF_BUILD_NAME_LIBSOXR=libsoxr-arm64
FF_SOURCE=$FF_BUILD_ROOT/$FF_BUILD_NAME
FF_CROSS_PREFIX=aarch64-linux-android
FF_TOOLCHAIN_NAME=${FF_CROSS_PREFIX}-${FF_GCC_64_VER}
FF_CFG_FLAGS="$FF_CFG_FLAGS --arch=aarch64 --enable-yasm"
FF_EXTRA_CFLAGS="$FF_EXTRA_CFLAGS"
FF_EXTRA_LDFLAGS="$FF_EXTRA_LDFLAGS"
FF_ASSEMBLER_SUB_DIRS="aarch64 neon"
else
echo "unknown architecture $FF_ARCH";
exit 1
fi
if [ ! -d $FF_SOURCE ]; then
echo ""
echo "!! ERROR"
echo "!! Can not find FFmpeg directory for $FF_BUILD_NAME"
echo "!! Run 'sh init-android.sh' first"
echo ""
exit 1
fi
FF_TOOLCHAIN_PATH=$FF_BUILD_ROOT/build/$FF_BUILD_NAME/toolchain
FF_MAKE_TOOLCHAIN_FLAGS="$FF_MAKE_TOOLCHAIN_FLAGS --install-dir=$FF_TOOLCHAIN_PATH"
FF_SYSROOT=$FF_TOOLCHAIN_PATH/sysroot
FF_PREFIX=$FF_BUILD_ROOT/build/$FF_BUILD_NAME/output
FF_DEP_OPENSSL_INC=$FF_BUILD_ROOT/build/$FF_BUILD_NAME_OPENSSL/output/include
FF_DEP_OPENSSL_LIB=$FF_BUILD_ROOT/build/$FF_BUILD_NAME_OPENSSL/output/lib
FF_DEP_LIBSOXR_INC=$FF_BUILD_ROOT/build/$FF_BUILD_NAME_LIBSOXR/output/include
FF_DEP_LIBSOXR_LIB=$FF_BUILD_ROOT/build/$FF_BUILD_NAME_LIBSOXR/output/lib
case "$UNAME_S" in
CYGWIN_NT-*)
FF_SYSROOT="$(cygpath -am $FF_SYSROOT)"
FF_PREFIX="$(cygpath -am $FF_PREFIX)"
;;
esac
mkdir -p $FF_PREFIX
# mkdir -p $FF_SYSROOT
FF_TOOLCHAIN_TOUCH="$FF_TOOLCHAIN_PATH/touch"
if [ ! -f "$FF_TOOLCHAIN_TOUCH" ]; then
$ANDROID_NDK/build/tools/make-standalone-toolchain.sh \
$FF_MAKE_TOOLCHAIN_FLAGS \
--platform=$FF_ANDROID_PLATFORM \
--toolchain=$FF_TOOLCHAIN_NAME
touch $FF_TOOLCHAIN_TOUCH;
fi
#--------------------
echo ""
echo "--------------------"
echo "[*] check ffmpeg env"
echo "--------------------"
export PATH=$FF_TOOLCHAIN_PATH/bin/:$PATH
#export CC="ccache ${FF_CROSS_PREFIX}-gcc"
export CC="${FF_CROSS_PREFIX}-gcc"
export LD=${FF_CROSS_PREFIX}-ld
export AR=${FF_CROSS_PREFIX}-ar
export STRIP=${FF_CROSS_PREFIX}-strip
FF_CFLAGS="-O3 -Wall -pipe \
-std=c99 \
-ffast-math \
-fstrict-aliasing -Werror=strict-aliasing \
-Wno-psabi -Wa,--noexecstack \
-DANDROID -DNDEBUG"
# cause av_strlcpy crash with gcc4.7, gcc4.8
# -fmodulo-sched -fmodulo-sched-allow-regmoves
# --enable-thumb is OK
#FF_CFLAGS="$FF_CFLAGS -mthumb"
# not necessary
#FF_CFLAGS="$FF_CFLAGS -finline-limit=300"
export COMMON_FF_CFG_FLAGS=
. $FF_BUILD_ROOT/../../config/module.sh
#--------------------
# with openssl
if [ -f "${FF_DEP_OPENSSL_LIB}/libssl.a" ]; then
echo "OpenSSL detected"
# FF_CFG_FLAGS="$FF_CFG_FLAGS --enable-nonfree"
FF_CFG_FLAGS="$FF_CFG_FLAGS --enable-openssl"
FF_CFLAGS="$FF_CFLAGS -I${FF_DEP_OPENSSL_INC}"
FF_DEP_LIBS="$FF_DEP_LIBS -L${FF_DEP_OPENSSL_LIB} -lssl -lcrypto"
fi
if [ -f "${FF_DEP_LIBSOXR_LIB}/libsoxr.a" ]; then
echo "libsoxr detected"
FF_CFG_FLAGS="$FF_CFG_FLAGS --enable-libsoxr"
FF_CFLAGS="$FF_CFLAGS -I${FF_DEP_LIBSOXR_INC}"
FF_DEP_LIBS="$FF_DEP_LIBS -L${FF_DEP_LIBSOXR_LIB} -lsoxr"
fi
FF_CFG_FLAGS="$FF_CFG_FLAGS $COMMON_FF_CFG_FLAGS"
#--------------------
# Standard options:
FF_CFG_FLAGS="$FF_CFG_FLAGS --prefix=$FF_PREFIX"
# Advanced options (experts only):
FF_CFG_FLAGS="$FF_CFG_FLAGS --cross-prefix=${FF_CROSS_PREFIX}-"
FF_CFG_FLAGS="$FF_CFG_FLAGS --enable-cross-compile"
FF_CFG_FLAGS="$FF_CFG_FLAGS --target-os=linux"
FF_CFG_FLAGS="$FF_CFG_FLAGS --enable-pic"
# FF_CFG_FLAGS="$FF_CFG_FLAGS --disable-symver"
if [ "$FF_ARCH" = "x86" ]; then
FF_CFG_FLAGS="$FF_CFG_FLAGS --disable-asm"
else
# Optimization options (experts only):
FF_CFG_FLAGS="$FF_CFG_FLAGS --enable-asm"
FF_CFG_FLAGS="$FF_CFG_FLAGS --enable-inline-asm"
fi
case "$FF_BUILD_OPT" in
debug)
FF_CFG_FLAGS="$FF_CFG_FLAGS --disable-optimizations"
FF_CFG_FLAGS="$FF_CFG_FLAGS --enable-debug"
FF_CFG_FLAGS="$FF_CFG_FLAGS --disable-small"
;;
*)
FF_CFG_FLAGS="$FF_CFG_FLAGS --enable-optimizations"
FF_CFG_FLAGS="$FF_CFG_FLAGS --enable-debug"
FF_CFG_FLAGS="$FF_CFG_FLAGS --enable-small"
;;
esac
#--------------------
echo ""
echo "--------------------"
echo "[*] configurate ffmpeg"
echo "--------------------"
cd $FF_SOURCE
if [ -f "./config.h" ]; then
echo 'reuse configure'
else
which $CC
./configure $FF_CFG_FLAGS \
--extra-cflags="$FF_CFLAGS $FF_EXTRA_CFLAGS" \
--extra-ldflags="$FF_DEP_LIBS $FF_EXTRA_LDFLAGS"
make clean
fi
#--------------------
echo ""
echo "--------------------"
echo "[*] compile ffmpeg"
echo "--------------------"
cp config.* $FF_PREFIX
make $FF_MAKE_FLAGS > /dev/null
make install
mkdir -p $FF_PREFIX/include/libffmpeg
cp -f config.h $FF_PREFIX/include/libffmpeg/config.h
#--------------------
echo ""
echo "--------------------"
echo "[*] link ffmpeg"
echo "--------------------"
echo $FF_EXTRA_LDFLAGS
FF_C_OBJ_FILES=
FF_ASM_OBJ_FILES=
for MODULE_DIR in $FF_MODULE_DIRS
do
C_OBJ_FILES="$MODULE_DIR/*.o"
if ls $C_OBJ_FILES 1> /dev/null 2>&1; then
echo "link $MODULE_DIR/*.o"
FF_C_OBJ_FILES="$FF_C_OBJ_FILES $C_OBJ_FILES"
fi
for ASM_SUB_DIR in $FF_ASSEMBLER_SUB_DIRS
do
ASM_OBJ_FILES="$MODULE_DIR/$ASM_SUB_DIR/*.o"
if ls $ASM_OBJ_FILES 1> /dev/null 2>&1; then
echo "link $MODULE_DIR/$ASM_SUB_DIR/*.o"
FF_ASM_OBJ_FILES="$FF_ASM_OBJ_FILES $ASM_OBJ_FILES"
fi
done
done
$CC -lm -lz -shared --sysroot=$FF_SYSROOT -Wl,--no-undefined -Wl,-z,noexecstack $FF_EXTRA_LDFLAGS \
-Wl,-soname,libijkffmpeg.so \
$FF_C_OBJ_FILES \
$FF_ASM_OBJ_FILES \
$FF_DEP_LIBS \
-o $FF_PREFIX/libijkffmpeg.so
mysedi() {
f=$1
exp=$2
n=`basename $f`
cp $f /tmp/$n
sed $exp /tmp/$n > $f
rm /tmp/$n
}
echo ""
echo "--------------------"
echo "[*] create files for shared ffmpeg"
echo "--------------------"
rm -rf $FF_PREFIX/shared
mkdir -p $FF_PREFIX/shared/lib/pkgconfig
ln -s $FF_PREFIX/include $FF_PREFIX/shared/include
ln -s $FF_PREFIX/libijkffmpeg.so $FF_PREFIX/shared/lib/libijkffmpeg.so
cp $FF_PREFIX/lib/pkgconfig/*.pc $FF_PREFIX/shared/lib/pkgconfig
for f in $FF_PREFIX/lib/pkgconfig/*.pc; do
# in case empty dir
if [ ! -f $f ]; then
continue
fi
cp $f $FF_PREFIX/shared/lib/pkgconfig
f=$FF_PREFIX/shared/lib/pkgconfig/`basename $f`
# OSX sed doesn't have in-place(-i)
mysedi $f 's/\/output/\/output\/shared/g'
mysedi $f 's/-lavcodec/-lijkffmpeg/g'
mysedi $f 's/-lavfilter/-lijkffmpeg/g'
mysedi $f 's/-lavformat/-lijkffmpeg/g'
mysedi $f 's/-lavutil/-lijkffmpeg/g'
mysedi $f 's/-lswresample/-lijkffmpeg/g'
mysedi $f 's/-lswscale/-lijkffmpeg/g'
done
这里说下上面用到的一个do-detect-env.sh在我们环境ndk版本不匹配的时候,这个脚本会报错,我们大概看一下,就能知道他check的是什么。分三块。
1. 必须指定ANDROID_NDK
2. 看来NDK-r10e是个分界点,判断版本号的方式不一样,输出FLAG也不一样
3. 针对mac和windows系统,也有不同区分
#--------------------
set -e
UNAME_S=$(uname -s)
UNAME_SM=$(uname -sm)
echo "build on $UNAME_SM"
echo "ANDROID_NDK=$ANDROID_NDK"
if [ -z "$ANDROID_NDK" ]; then
echo "You must define ANDROID_NDK before starting."
echo "They must point to your NDK directories."
echo ""
exit 1
fi
# try to detect NDK version
export IJK_GCC_VER=4.9
export IJK_GCC_64_VER=4.9
export IJK_MAKE_TOOLCHAIN_FLAGS=
export IJK_MAKE_FLAG=
export IJK_NDK_REL=$(grep -o '^r[0-9]*.*' $ANDROID_NDK/RELEASE.TXT 2>/dev/null | sed 's/[[:space:]]*//g' | cut -b2-)
case "$IJK_NDK_REL" in
10e*)
# we don't use 4.4.3 because it doesn't handle threads correctly.
if test -d ${ANDROID_NDK}/toolchains/arm-linux-androideabi-4.8
# if gcc 4.8 is present, it's there for all the archs (x86, mips, arm)
then
echo "NDKr$IJK_NDK_REL detected"
case "$UNAME_S" in
Darwin)
export IJK_MAKE_TOOLCHAIN_FLAGS="$IJK_MAKE_TOOLCHAIN_FLAGS --system=darwin-x86_64"
;;
CYGWIN_NT-*)
export IJK_MAKE_TOOLCHAIN_FLAGS="$IJK_MAKE_TOOLCHAIN_FLAGS --system=windows-x86_64"
;;
esac
else
echo "You need the NDKr10e or later"
exit 1
fi
;;
*)
IJK_NDK_REL=$(grep -o '^Pkg\.Revision.*=[0-9]*.*' $ANDROID_NDK/source.properties 2>/dev/null | sed 's/[[:space:]]*//g' | cut -d "=" -f 2)
echo "IJK_NDK_REL=$IJK_NDK_REL"
case "$IJK_NDK_REL" in
11*|12*|13*|14*)
if test -d ${ANDROID_NDK}/toolchains/arm-linux-androideabi-4.9
then
echo "NDKr$IJK_NDK_REL detected"
else
echo "You need the NDKr10e or later"
exit 1
fi
;;
*)
echo "You need the NDKr10e or later"
exit 1
;;
esac
;;
esac
case "$UNAME_S" in
Darwin)
export IJK_MAKE_FLAG=-j`sysctl -n machdep.cpu.thread_count`
;;
CYGWIN_NT-*)
IJK_WIN_TEMP="$(cygpath -am /tmp)"
export TEMPDIR=$IJK_WIN_TEMP/
echo "Cygwin temp prefix=$IJK_WIN_TEMP/"
;;
esac
这里有个疑问就是libsoxr和libssl貌似没有执行编译脚本啊。。
发现这里边根本就不会编译libsoxr和libssl而是检测这两个是否有静态库存在,如果存在才编译入ffmpeg
3. compile-ijk.sh
会cd到不同的源码目录下,执行ndk-build
有意义的,总结起来,就这两句:
cd "ijkplayer/ijkplayer-$PARAM_TARGET/src/main/jni"
$ANDROID_NDK/ndk-build $FF_MAKEFLAGS
if [ -z "$ANDROID_NDK" -o -z "$ANDROID_NDK" ]; then
echo "You must define ANDROID_NDK, ANDROID_SDK before starting."
echo "They must point to your NDK and SDK directories.\n"
exit 1
fi
REQUEST_TARGET=$1
REQUEST_SUB_CMD=$2
ACT_ABI_32="armv5 armv7a x86"
ACT_ABI_64="armv5 armv7a arm64 x86 x86_64"
ACT_ABI_ALL=$ACT_ABI_64
UNAME_S=$(uname -s)
FF_MAKEFLAGS=
if which nproc >/dev/null
then
FF_MAKEFLAGS=-j`nproc`
elif [ "$UNAME_S" = "Darwin" ] && which sysctl >/dev/null
then
FF_MAKEFLAGS=-j`sysctl -n machdep.cpu.thread_count`
fi
do_sub_cmd () {
SUB_CMD=$1
if [ -L "./android-ndk-prof" ]; then
rm android-ndk-prof
fi
if [ "$PARAM_SUB_CMD" = 'prof' ]; then
echo 'profiler build: YES';
ln -s ../../../../../../ijkprof/android-ndk-profiler/jni android-ndk-prof
else
echo 'profiler build: NO';
ln -s ../../../../../../ijkprof/android-ndk-profiler-dummy/jni android-ndk-prof
fi
case $SUB_CMD in
prof)
$ANDROID_NDK/ndk-build $FF_MAKEFLAGS
;;
clean)
$ANDROID_NDK/ndk-build clean
;;
rebuild)
$ANDROID_NDK/ndk-build clean
$ANDROID_NDK/ndk-build $FF_MAKEFLAGS
;;
*)
$ANDROID_NDK/ndk-build $FF_MAKEFLAGS
;;
esac
}
do_ndk_build () {
PARAM_TARGET=$1
PARAM_SUB_CMD=$2
case "$PARAM_TARGET" in
armv5|armv7a)
cd "ijkplayer/ijkplayer-$PARAM_TARGET/src/main/jni"
do_sub_cmd $PARAM_SUB_CMD
cd -
;;
arm64|x86|x86_64)
cd "ijkplayer/ijkplayer-$PARAM_TARGET/src/main/jni"
if [ "$PARAM_SUB_CMD" = 'prof' ]; then PARAM_SUB_CMD=''; fi
do_sub_cmd $PARAM_SUB_CMD
cd -
;;
esac
}
case "$REQUEST_TARGET" in
"")
do_ndk_build armv7a;
;;
armv5|armv7a|arm64|x86|x86_64)
do_ndk_build $REQUEST_TARGET $REQUEST_SUB_CMD;
;;
all32)
for ABI in $ACT_ABI_32
do
do_ndk_build "$ABI" $REQUEST_SUB_CMD;
done
;;
all|all64)
for ABI in $ACT_ABI_64
do
do_ndk_build "$ABI" $REQUEST_SUB_CMD;
done
;;
clean)
for ABI in $ACT_ABI_ALL
do
do_ndk_build "$ABI" clean;
done
;;
*)
echo "Usage:"
echo " compile-ijk.sh armv5|armv7a|arm64|x86|x86_64"
echo " compile-ijk.sh all|all32"
echo " compile-ijk.sh all64"
echo " compile-ijk.sh clean"
;;
esac
ndk-build会找当前目录下的Android.mk,具体就到了jni编译部分了。
粗略的介绍就到这里了。谢谢!