2012-05-26 51 views
1

我正在嘗試編譯適用於Android的ffmpeg,但是適用於x86架構。我已經成功編譯了一個arm .so,並且它一切正常,而且我認爲通過在構建腳本內的相關位置用x86替換arm可能會取得成效。不幸的是,情況並非如此,我發生了一些奇怪的事情。編譯用於x86架構的Android(ndk)中的ffmpeg

首先,我得到這個,而它的編譯的ffmpeg:

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

通知拱臂代替拱86。最後,我得到這樣的:

/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 

我希望我做錯了什麼,而不是這不是可能的。

謝謝!

回答

2

我已經能夠編譯了Atom,但GoogleTV的有NDK的,這可以解釋爲什麼我所有的努力不支持編輯我的GoogleTV設備的NDK不起作用。我希望它即將推出!

0

這是我的構建腳本,如果它有幫助,我看到一些我已經設置的東西,你似乎並不認爲哪些可能是你的問題的一部分。我從ffmpeg源代碼目錄(源代碼)下的目錄中獲取它。 I.E.該腳本被稱爲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 
+0

謝謝,賈斯汀 我發現Google TV不支持NDK!感謝您的腳本,它可能很快就會使用。 – Ankur22