【问题标题】:Compiling ffmpeg for use in Android (ndk) for x86 architecture编译 ffmpeg 以用于 x86 架构的 Android (ndk)
【发布时间】:2012-09-26 19:08:39
【问题描述】:

我正在尝试为 Android 编译 ffmpeg,但针对 x86 架构。我已经成功编译了一个 arm .so 并且一切正常,尽管通过在构建脚本中的相关位置用 x86 替换 arm 来解决问题。不幸的是,情况并非如此,我遇到了一些奇怪的事情。

首先我在编译 ffmpeg 时得到这个:

/home/ankur/android-ndk-r8/platforms/android-8/arch-arm//usr/include/strings.h:49: warning: redundant redeclaration of 'index'

注意拱臂而不是拱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

我希望我做错了什么,而不是这不可能。

谢谢!

【问题讨论】:

    标签: compilation android-ndk ffmpeg intel


    【解决方案1】:

    我已经能够为 Atom 编译,但 GoogleTV 不支持 NDK,这解释了为什么我为我的 GoogleTV 设备编译 NDK 的所有尝试都不起作用。我希望它快点到来!

    【讨论】:

      【解决方案2】:

      这是我的构建脚本,如果有帮助,我会看到我设置的一些您似乎没有设置的内容,这可能是您的问题的一部分。我从 ffmpeg 源目录(源)下方的目录中获取它。 IE。该脚本名为 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
      

      【讨论】:

      • 谢谢,Justin 我发现 Google TV 不支持 NDK!不过感谢您的脚本,它可能很快就会投入使用。
      猜你喜欢
      • 1970-01-01
      • 2017-11-22
      • 2011-07-09
      • 2014-09-11
      • 2013-12-10
      • 2014-07-30
      • 2012-12-21
      • 1970-01-01
      • 2019-03-12
      相关资源
      最近更新 更多