Compilation 编译ffmpeg以便在Android(ndk)中使用x86体系结构
我试图为Android编译ffmpeg,但不针对x86架构。我已经成功地编译了一个arm,所以它都可以正常工作,我认为在构建脚本的相关位置用x86替换arm就可以做到这一点。不幸的是,事实并非如此,我遇到了一些奇怪的事情 首先,我在编译ffmpeg时得到了这个:Compilation 编译ffmpeg以便在Android(ndk)中使用x86体系结构,compilation,android-ndk,ffmpeg,intel,Compilation,Android Ndk,Ffmpeg,Intel,我试图为Android编译ffmpeg,但不针对x86架构。我已经成功地编译了一个arm,所以它都可以正常工作,我认为在构建脚本的相关位置用x86替换arm就可以做到这一点。不幸的是,事实并非如此,我遇到了一些奇怪的事情 首先,我在编译ffmpeg时得到了这个: /home/ankur/android-ndk-r8/platforms/android-8/arch-arm//usr/include/strings.h:49: warning: redundant redeclaration of
/home/ankur/android-ndk-r8/platforms/android-8/arch-arm//usr/include/strings.h:49: warning: redundant redeclaration of 'index'
请注意拱臂,而不是arch-x86。我终于明白了:
/home/ankur/android-ndk-r8/toolchains/x86-4.4.3/prebuilt/linux-x86/bin/i686-android-linux-ld: libavcodec/libavcodec.a(4xm.o): Relocations in generic ELF (EM: 40)
/home/ankur/android-ndk-r8/toolchains/x86-4.4.3/prebuilt/linux-x86/bin/i686-android-linux-ld: libavcodec/libavcodec.a(4xm.o): Relocations in generic ELF (EM: 40)
/home/ankur/android-ndk-r8/toolchains/x86-4.4.3/prebuilt/linux-x86/bin/i686-android-linux-ld: libavcodec/libavcodec.a(4xm.o): Relocations in generic ELF (EM: 40)
libavcodec/libavcodec.a(4xm.o): could not read symbols: File in wrong format
我创建的构建脚本如下所示:
#!/bin/bash
NDK=~/android-ndk-r8
PLATFORM=$NDK/platforms/android-8/arch-x86/
PREBUILT=$NDK/toolchains/x86-4.4.3/prebuilt/linux-x86
function build_one_r8
{
./configure \
--disable-shared \
--enable-static \
--enable-gpl \
--enable-version3 \
--enable-nonfree \
--disable-doc \
--disable-ffmpeg \
--disable-ffplay \
--disable-ffprobe \
--disable-ffserver \
--disable-avdevice \
--disable-avfilter \
--disable-postproc \
--enable-small \
--cross-prefix=$PREBUILT/bin/i686-android-linux- \
--enable-cross-compile \
--target-os=linux \
--extra-cflags="-I$PLATFORM/usr/include" \
--arch=x86 \
--disable-symver \
--disable-debug \
--disable-stripping \
$ADDITIONAL_CONFIGURE_FLAG
sed -i 's/HAVE_LRINT 0/HAVE_LRINT 1/g' config.h
sed -i 's/HAVE_LRINTF 0/HAVE_LRINTF 1/g' config.h
sed -i 's/HAVE_ROUND 0/HAVE_ROUND 1/g' config.h
sed -i 's/HAVE_ROUNDF 0/HAVE_ROUNDF 1/g' config.h
sed -i 's/HAVE_TRUNC 0/HAVE_TRUNC 1/g' config.h
sed -i 's/HAVE_TRUNCF 0/HAVE_TRUNCF 1/g' config.h
make clean
make -j4 install
$PREBUILT/bin/i686-android-linux-ar d libavcodec/libavcodec.a inverse.o
$PREBUILT/bin/i686-android-linux-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/i686-android-linux/4.4.3/libgcc.a
}
function build_one_r8_2
{
$PREBUILT/bin/i686-android-linux-ar d libavcodec/libavcodec.a inverse.o
$PREBUILT/bin/i686-android-linux-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/i686-android-linux/4.4.3/libgcc.a
}
#x86
CPU=x86
OPTIMIZE_CFLAGS="-march=$CPU "
PREFIX=./android/$CPU
ADDITIONAL_CONFIGURE_FLAG=
build_one_r8
我希望我做错了什么,而不是这不可能
谢谢 这是我的构建脚本,如果它有帮助的话,我会看到一些我设置的东西,但您似乎没有注意到,这可能是您的问题的一部分。我从ffmpeg源目录(source)下面的目录中获取它。也就是说,脚本名为build.sh,位于~/android/ffmpeg中,ffmpeg源位于~/android/ffmpeg/source中,当我运行脚本时,我的构建输出最终位于~/android/build/armeabi-v7a中:
~/android/ffmpeg$ source build.sh
这是build.sh:
#!/bin/bash
NDK=~/android/ndk
SYSROOT=$NDK/platforms/android-9/arch-arm
TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-
ABI="armeabi-v7a"
CPU="armv7-a"
ARCH="arm"
FPU="vfpv3-d16"
ANDROID_LIBS=$SYSROOT/usr/lib
DEST="../build/ffmpeg/$ABI"
EXTRA_LDFLAGS="-Wl,--fix-cortex-a8 -L$ANDROID_LIBS -Wl,-rpath-link,$ANDROID_LIBS"
EXTRA_CXXFLAGS="-Wno-multichar -Wno-psabi -fno-exceptions -fno-rtti"
EXTRA_CFLAGS="-DANDROID -marm -march=$CPU -mfloat-abi=softfp -mfpu=$FPU"
function configure
{
./configure \
--target-os=linux \
--prefix=$DEST \
--cross-prefix=$TOOLCHAIN \
--sysroot=$SYSROOT \
--extra-cflags="$EXTRA_CFLAGS" \
--extra-ldflags="$EXTRA_LDFLAGS" \
--extra-cxxflags="$EXTRA_CXXFLAGS" \
--enable-cross-compile \
--extra-libs="-lgcc" \
--arch=$ARCH \
--cpu=$CPU \
--disable-debug \
--disable-runtime-cpudetect \
--disable-optimizations \
--disable-neon \
--disable-network \
--disable-armv5te \
--disable-armv6 \
--disable-armv6t2 \
--disable-armvfp \
--disable-everything \
--disable-doc \
--disable-decoders \
--disable-encoders \
--disable-demuxers \
--disable-muxers \
--disable-protocols \
--disable-indevs \
--disable-filters \
--disable-outdevs \
--disable-bsfs \
--disable-shared \
--disable-ffprobe \
--disable-ffserver \
--disable-avfilter \
--disable-swresample \
--disable-avdevice \
--disable-ffplay \
--disable-ffmpeg \
--disable-swscale-alpha \
--disable-avresample \
--enable-static \
--enable-pthreads \
--enable-protocol=file \
--enable-libvpx \
--enable-decoder=vp8 \
--enable-parser=vp8 \
--enable-demuxer=matroska
}
cd source
make clean &&
configure &&
make -j8 &&
rm -rf $DEST &&
mkdir -p $DEST &&
make install
我已经能够为Atom编译了,但是Google TV不支持NDK,这就解释了为什么我为Google TV设备编译NDK的所有尝试都没有成功。我希望它很快就来 谢谢,贾斯汀,我发现谷歌电视不支持NDK!不过谢谢你的脚本,它可能很快就会投入使用。