一匙瘪,開發(fā)環(huán)境的搭建
1.安裝ubuntu系統(tǒng),我這里演示的是ubuntu_16.04_LTS赞哗。
注意:[ubuntu14.04交叉編譯ffmpeg出現(xiàn)unable to create an executable file. C compiler test failed.]
解決:我64位ubuntu是新裝的,都還沒安裝32位的兼容庫,于是:
sudo apt-get install ia32-libs
坑又來了8胨亍!亦鳞!
Reading package lists... Done
Building dependency tree
Reading state information... Done
Package ia32-libs is not available, but is referred to by another package.
This may mean that the package is missing, has been obsoleted, or
is only available from another source
However the following packages replace it:
lib32ncurses5 lib32z1
E: Package 'ia32-libs' has no installation candidate
已經(jīng)被其他的包給替代了付鹿。。蚜迅。
重新開刷:
sudo apt-get update
sudo apt-get -y upgrade
apt-get -y install gcc g++ make cmake curl libcurl3 libcurl3-dev bzip2 pkg-config
OK舵匾!
2.進(jìn)入Home目錄下面(圖形界面非命令控制臺),按Ctrl+H谁不,就可以看到影藏的一些文件了坐梯。
3.找到.bashrc文件,直接打開刹帕。
4.修改.bashrc文件吵血,在最末尾加入下面內(nèi)容:(當(dāng)然前提是你已經(jīng)安裝了相應(yīng)的環(huán)境)
export JAVA_HOME=/home/chinese-boy/Android/jdk1.8.0_121
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export ANDROID_NDK=/home/chinese-boy/Android/android-ndk-r10e
export ANDROID_SDK=/home/chinese-boy/Android/Sdk
export PATH=${JAVA_HOME}/bin:$ANDROID_NDK:$PATH
5.這樣一個android NDK開發(fā)環(huán)境基本上就配置完成了。
二偷溺,開始編譯ffmpeg
1.到官網(wǎng)下載最新的ffmepg源碼蹋辅,解壓到/home/Android/ffmpeg3.2/目錄下面,最好chmod u+x 一下
2.開始編寫build_android.sh shell腳本:內(nèi)容如下:
#!/bin/bash
NDK=/home/chinese-boy/Android/android-ndk-r10e
SYSROOT=$NDK/platforms/android-8/arch-arm/
TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64
function build_one
{
./configure \
--prefix=$PREFIX \
--disable-shared \
--enable-static \
--disable-doc \
--disable-ffmpeg \
--disable-ffplay \
--disable-ffprobe \
--disable-ffserver \
--disable-doc \
--disable-symver \
--enable-small \
--cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \
--target-os=linux \
--arch=arm \
--enable-cross-compile \
--sysroot=$SYSROOT \
--extra-cflags="-Os -fpic $ADDI_CFLAGS" \
--extra-ldflags="$ADDI_LDFLAGS" \
$ADDITIONAL_CONFIGURE_FLAG
make clean
make
make install
}
CPU=arm
PREFIX=$(pwd)/android/$CPU
ADDI_CFLAGS="-marm"
build_one
注意:
1../configure 后面的配置可以根據(jù)自己的需要來填寫挫掏,其他基本都是固定格式了
2.如果是直接copy上面的shell腳本侦另,可能會是dos格式,請使用dos2unix build_android.sh 轉(zhuǎn)換一下,刪掉多余空格(這一點非常重要褒傅,我就掉坑里面了弃锐,報錯各種命令找不到各種路徑找不到之類的,哎5钔小E铡!Vе瘛Pⅰ!礼搁!)
dos2unix 是一個工具柳洋,如果沒有安裝的話請先安裝一下:sudo apt-get install dos2unix ,很快就完事叹坦。
下面貼一段報錯信息:
./build_android.sh: line 18: --enable-shared: command not found
./build_android.sh: line 20: --disable-static: command not found
./build_android.sh: line 22: --disable-doc: command not found
./build_android.sh: line 24: --disable-ffmpeg: command not found
./build_android.sh: line 26: --disable-ffplay: command not found
./build_android.sh: line 28: --disable-ffprobe: command not found
./build_android.sh: line 30: --disable-ffserver: command not found
./build_android.sh: line 32: --disable-avdevice: command not found
再來一段大神的shell腳本熊镣,基本夠了:
#!/bin/bash
######################################################
# Usage:
# put this script in top of FFmpeg source tree
# ./build_android
# It generates binary for following architectures:
# ARMv6
# ARMv6+VFP
# ARMv7+VFPv3-d16 (Tegra2)
# ARMv7+Neon (Cortex-A8)
# Customizing:
# 1. Feel free to change ./configure parameters for more features
# 2. To adapt other ARM variants
# set $CPU and $OPTIMIZE_CFLAGS
# call build_one
######################################################
NDK=../..
PLATFORM=$NDK/platforms/android-8/arch-arm/
PREBUILT=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64
function build_one
{
./configure --target-os=linux \
--prefix=$PREFIX \
--enable-cross-compile \
--extra-libs="-lgcc" \
--arch=arm \
--cc=$PREBUILT/bin/arm-linux-androideabi-gcc \
--cross-prefix=$PREBUILT/bin/arm-linux-androideabi- \
--nm=$PREBUILT/bin/arm-linux-androideabi-nm \
--sysroot=$PLATFORM \
--extra-cflags=" -O3 -fpic -DANDROID -DHAVE_SYS_UIO_H=1 -Dipv6mr_interface=ipv6mr_ifindex -fasm -Wno-psabi -fno-short-enums -fno-strict-aliasing -finline-limit=300 $OPTIMIZE_CFLAGS " \
--disable-shared \
--enable-static \
--extra-ldflags="-Wl,-rpath-link=$PLATFORM/usr/lib -L$PLATFORM/usr/lib -nostdlib -lc -lm -ldl -llog" \
--disable-everything \
--enable-demuxer=mov \
--enable-demuxer=h264 \
--disable-ffplay \
--enable-protocol=file \
--enable-avformat \
--enable-avcodec \
--enable-decoder=rawvideo \
--enable-decoder=mjpeg \
--enable-decoder=h263 \
--enable-decoder=mpeg4 \
--enable-decoder=h264 \
--enable-parser=h264 \
--disable-network \
--enable-zlib \
--disable-avfilter \
--disable-avdevice \
$ADDITIONAL_CONFIGURE_FLAG
make clean
make -j4 install
$PREBUILT/bin/arm-linux-androideabi-ar d libavcodec/libavcodec.a inverse.o
$PREBUILT/bin/arm-linux-androideabi-ld -rpath-link=$PLATFORM/usr/lib -L$PLATFORM/usr/lib -soname libffmpeg.so -shared -nostdlib -z,noexecstack -Bsymbolic --whole-archive --no-undefined -o $PREFIX/libffmpeg.so libavcodec/libavcodec.a libavformat/libavformat.a libavutil/libavutil.a libswscale/libswscale.a -lc -lm -lz -ldl -llog --warn-once --dynamic-linker=/system/bin/linker $PREBUILT/lib/gcc/arm-linux-androideabi/4.8/libgcc.a
}
#arm v6
#CPU=armv6
#OPTIMIZE_CFLAGS="-marm -march=$CPU"
#PREFIX=./android/$CPU
#ADDITIONAL_CONFIGURE_FLAG=
#build_one
#arm v7vfpv3
CPU=armv7-a
OPTIMIZE_CFLAGS="-mfloat-abi=softfp -mfpu=vfpv3-d16 -marm -march=$CPU "
PREFIX=./android/$CPU
ADDITIONAL_CONFIGURE_FLAG=
build_one
#arm v7vfp
#CPU=armv7-a
#OPTIMIZE_CFLAGS="-mfloat-abi=softfp -mfpu=vfp -marm -march=$CPU "
#PREFIX=./android/$CPU-vfp
#ADDITIONAL_CONFIGURE_FLAG=
#build_one
#arm v7n
#CPU=armv7-a
#OPTIMIZE_CFLAGS="-mfloat-abi=softfp -mfpu=neon -marm -march=$CPU -mtune=cortex-a8"
#PREFIX=./android/$CPU
#ADDITIONAL_CONFIGURE_FLAG=--enable-neon
#build_one
#arm v6+vfp
#CPU=armv6
#OPTIMIZE_CFLAGS="-DCMP_HAVE_VFP -mfloat-abi=softfp -mfpu=vfp -marm -march=$CPU"
#PREFIX=./android/${CPU}_vfp
#ADDITIONAL_CONFIGURE_FLAG=
#build_one
3.增加執(zhí)行權(quán)限,執(zhí)行:
$chmod a+x build_android.sh
$./build_android.sh
生成:[頭文件]android/arm/include/.h 和 [靜態(tài)庫文件]android/arm/lib/.a
三.接下來就是拿來主義了募书,開始Android應(yīng)用之旅:
1.copy后的目錄結(jié)構(gòu)如下:
2.android.mk如下:(如果是動態(tài)庫的話绪囱,PREBUILT_SHARED_LIBRARY,LOCAL_SHARED_LIBRARIES莹捡,.a -》.so)
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := libavcodec
LOCAL_SRC_FILES := prebuilt/lib/$(TARGET_ARCH_ABI)/libavcodec.a
include $(PREBUILT_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := libavformat
LOCAL_SRC_FILES := prebuilt/lib/$(TARGET_ARCH_ABI)/libavformat.a
include $(PREBUILT_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := libavutil
LOCAL_SRC_FILES := prebuilt/lib/$(TARGET_ARCH_ABI)/libavutil.a
include $(PREBUILT_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := libswresample
LOCAL_SRC_FILES := prebuilt/lib/$(TARGET_ARCH_ABI)/libswresample.a
include $(PREBUILT_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := libswscale
LOCAL_SRC_FILES := prebuilt/lib/$(TARGET_ARCH_ABI)/libswscale.a
include $(PREBUILT_STATIC_LIBRARY)
# build jni
include $(CLEAR_VARS)
LOCAL_MODULE := ffmpeg
LOCAL_SRC_FILES := ffmpeg.cpp
LOCAL_C_INCLUDES += $(LOCAL_PATH)/prebuilt/include
LOCAL_LDLIBS := -llog -lz
LOCAL_STATIC_LIBRARIES := libavformat libavcodec libswscale libswresample libavutil
include $(BUILD_SHARED_LIBRARY)
3.android.mk如下:
#APP_ABI := all
#APP_ABI := armeabi armeabi-v7a arm64-v8a x86 x86_64
APP_ABI := armeabi
4.其中ffmpeg.cpp就是你自己要寫的jni代碼了鬼吵。
5.完畢總結(jié):文章一定要仔細(xì)看,中間的坑還是很多的篮赢。
http://blog.csdn.net/chengkaizone/article/details/52983495
http://blog.csdn.net/u011485531/article/details/55804380
http://www.cnblogs.com/wainiwann/p/6223342.html