title: FFmpeg support for libstagefright hardware decoding
body: <p>everyone:
  I am new to ffmpeg. Recently I am working on project to port ffmpeg to android device.
  At the beginning, I compiled ffmpeg to shared libs(.so files) in a very normal way following some guides on Internet, load them into my android app. It works perfectly.</p>
  
  <p>Now I want ffmpeg to use libstagefright to fulfill HW decoding.
  The problem is, I can compile the .so libs, but when I launch my app and load those .so libs, there is always a java.lang.UnsatisfiedLinkError:
  Cannot load library: reloc_library[1314]: 114 cannot locate '_ZN7android11MediaBufferC1Ej'</p>
  
  <p>I stuck there for a few days. Does anyone encountered any similar problems before? It would be great if someone can give me some hint about this error.</p>
  
  <p>My steps:
  1. Compile ffmpeg-2.1.4 souce code to .so shared libs. I use the build_libstagefright script to do this, and make some modification based on some guides from Internet.</p>
  
  <pre><code>#!/bin/bash
  #export NDK=/home/mingzhang/android/android-ndk-r9c
  export NDK=/home/mingzhang/android/android-ndk-r7
  if [ "$NDK" = "" ]; then
      echo NDK variable not set, assuming ${HOME}/android-ndk
      export NDK=${HOME}/android-ndk
  fi
  
  echo "Fetching Android system headers"
  git clone --depth=1 --branch gingerbread-release git://github.com/CyanogenMod/android_frameworks_base.git ../android-source/frameworks/base
  git clone --depth=1 --branch gingerbread-release git://github.com/CyanogenMod/android_frameworks_av.git ../android-source/frameworks/av
  git clone --depth=1 --branch gingerbread-release git://github.com/CyanogenMod/android_frameworks_native.git ../android-source/frameworks/native
  git clone --depth=1 --branch gingerbread-release git://github.com/CyanogenMod/android_hardware_libhardware.git ../android-source/hardware/libhardware
  git clone --depth=1 --branch gingerbread-release git://github.com/CyanogenMod/android_system_core.git ../android-source/system/core
  
  echo "Fetching Android libraries for linking"
  # Libraries from any froyo/gingerbread device/emulator should work
  # fine, since the symbols used should be available on most of them.
  #if [ ! -d "../android-libs" ]; then
  #    if [ ! -f "../update-cm-7.0.3-N1-signed.zip" ]; then
  #        wget http://download.cyanogenmod.com/get/update-cm-7.0.3-N1-signed.zip -P../
  #    fi
  #    unzip ../update-cm-7.0.3-N1-signed.zip system/lib/* -d../
  #    mv ../system/lib ../android-libs
  #    rmdir ../system
  #fi
  
  SYSROOT=$NDK/platforms/android-9/arch-arm
  # Expand the prebuilt/* path into the correct one
  #TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86_64
  TOOLCHAIN=/home/mingzhang/android/android-ndk-r7/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86
  export PATH=$TOOLCHAIN/bin:$PATH
  ANDROID_SOURCE=../android-source
  ANDROID_LIBS=../android-libs
  ABI="armeabi-v7a"
  CC=$TOOLCHAIN/bin/arm-linux-androideabi-gcc
  #CC=$TOOLCHAIN/bin/arm-eabi-gcc-4.4.3
  NM=$TOOLCHAIN/bin/arm-linux-androideabi-nm
  #NM=$TOOLCHAIN/bin/arm-eabi-nm
  
  rm -rf ../build/stagefright
  mkdir -p ../build/stagefright
  
  ADDI_CFLAGS="-marm"
  DEST=../build/stagefright
  DEST="$DEST/$ABI"
  
  FLAGS="--target-os=linux --arch=arm --cpu=armv7-a --cross-prefix=arm-linux-androideabi- --cc=$CC --nm=$NM"
  #FLAGS="--target-os=linux --arch=arm --cpu=armv7-a --cross-prefix=arm-eabi- --cc=$CC --nm=$NM"
  FLAGS="$FLAGS --sysroot=$SYSROOT"
  #FLAGS="$FLAGS --disable-avdevice --disable-decoder=h264 --disable-decoder=h264_vdpau --enable-libstagefright-h264"
  FLAGS="$FLAGS --enable-shared --disable-demuxers --disable-muxers --disable-parsers --disable-avdevice --disable-filters --disable-programs --disable-encoders --disable-decoders --disable-decoder=h264 --disable-decoder=h264_vdpau --enable-decoder=libstagefright_h264 --enable-libstagefright-h264 \
      --enable-asm \
      --enable-neon \
      --enable-cross-compile \
      --enable-gpl \
      --disable-static \
      --enable-memalign-hack"
  
  EXTRA_CFLAGS="-I$DEST/include"
  EXTRA_CFLAGS="$EXTRA_CFLAGS -I$ANDROID_SOURCE/frameworks/native/include"
  EXTRA_CFLAGS="$EXTRA_CFLAGS -I$ANDROID_SOURCE/frameworks/native/include/media/openmax"
  EXTRA_CFLAGS="$EXTRA_CFLAGS -I$ANDROID_SOURCE/frameworks/av/include"
  EXTRA_CFLAGS="$EXTRA_CFLAGS -I$ANDROID_SOURCE/frameworks/base/include -I$ANDROID_SOURCE/system/core/include"
  EXTRA_CFLAGS="$EXTRA_CFLAGS -I$ANDROID_SOURCE/hardware/libhardware/include"
  EXTRA_CFLAGS="$EXTRA_CFLAGS -I$ANDROID_SOURCE/frameworks/base/media/libstagefright"
  EXTRA_CFLAGS="$EXTRA_CFLAGS -I$ANDROID_SOURCE/frameworks/base/include/media/stagefright/openmax"
  EXTRA_CFLAGS="$EXTRA_CFLAGS -I$NDK/sources/cxx-stl/gnu-libstdc++/4.6/include -I$NDK/sources/cxx-stl/gnu-libstdc++/4.6/libs/$ABI/include"
  EXTRA_CFLAGS="$EXTRA_CFLAGS -I$NDK/sources/cxx-stl/stlport/stlport"
  EXTRA_CFLAGS="$EXTRA_CFLAGS -march=armv7-a -mfloat-abi=softfp -mfpu=neon -marm -mtune=cortex-a8"
  EXTRA_CFLAGS="$EXTRA_CFLAGS -O3 -fpic -DANDROID -DHAVE_SYS_UIO_H=1 -D_STLP_USE_NEWALLOC"
  
  EXTRA_LDFLAGS="-Wl,--fix-cortex-a8 -L$ANDROID_LIBS -Wl,-rpath-link,$ANDROID_LIBS -L$NDK/sources/cxx-stl/gnu-libstdc++/4.6/libs/$ABI -static-libstdc++"
  EXTRA_CXXFLAGS="-Wno-multichar -fno-exceptions -fno-rtti"
  FLAGS="$FLAGS --prefix=$DEST"
  
  mkdir -p $DEST
  
  echo $FLAGS --extra-cflags="$EXTRA_CFLAGS" --extra-ldflags="$EXTRA_LDFLAGS" --extra-cxxflags="$EXTRA_CXXFLAGS" &gt; $DEST/info.txt
  ./configure $FLAGS --extra-cflags="$EXTRA_CFLAGS" --extra-ldflags="$EXTRA_LDFLAGS" --extra-cxxflags="$EXTRA_CXXFLAGS" | tee $DEST/configuration.txt
  [ $PIPESTATUS == 0 ] || exit 1
  make clean
  #make -j4 || exit 1
  #make -j4
  make install || exit 1
  </code></pre>
  
  <ol start="2">
  <li><p>Copy the compiled include and lib directories to my android-ndk-r7/sources/ffmpeg-2.1.4/android/arm directory. The Android.mk file under this directory is.</p>
  
  <p>LOCAL_PATH:= $(call my-dir)</p>
  
  <p>include $(CLEAR_VARS)
  LOCAL_MODULE:= libavcodec
  LOCAL_SRC_FILES:= lib/libavcodec-55.so
  LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
  include $(PREBUILT_SHARED_LIBRARY)</p>
  
  <p>include $(CLEAR_VARS)
  LOCAL_MODULE:= libavformat
  LOCAL_SRC_FILES:= lib/libavformat-55.so
  LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
  include $(PREBUILT_SHARED_LIBRARY)</p>
  
  <p>include $(CLEAR_VARS)
  LOCAL_MODULE:= libswscale
  LOCAL_SRC_FILES:= lib/libswscale-2.so
  LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
  include $(PREBUILT_SHARED_LIBRARY)</p>
  
  <p>include $(CLEAR_VARS)
  LOCAL_MODULE:= libavutil
  LOCAL_SRC_FILES:= lib/libavutil-52.so
  LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
  include $(PREBUILT_SHARED_LIBRARY)</p>
  
  <p>include $(CLEAR_VARS)
  LOCAL_MODULE:= libavfilter
  LOCAL_SRC_FILES:= lib/libavfilter-3.so
  LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
  include $(PREBUILT_SHARED_LIBRARY)</p>
  
  <p>include $(CLEAR_VARS)
  LOCAL_MODULE:= libwsresample
  LOCAL_SRC_FILES:= lib/libswresample-0.so
  LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
  include $(PREBUILT_SHARED_LIBRARY)</p></li>
  <li><p>Under the jni directory of my android app, the Android.mk is.</p>
  
  <pre><code>LOCAL_PATH:= $(call my-dir)
  include $(CLEAR_VARS)
  
  LOCAL_MODULE    := libripple
  #LOCAL_CFLAGS    := -Werror
  LOCAL_SRC_FILES := entrypoint.cpp scene.cpp
  LOCAL_LDLIBS    := -llog -lGLESv2 -lm
  
  include $(BUILD_SHARED_LIBRARY)
  
  include $(CLEAR_VARS)
  
  LOCAL_MODULE    := myfflib
  LOCAL_SRC_FILES := fflib.c
  LOCAL_LDLIBS := -L/home/mingzhang/ffmpeg_android/android-libs -llog -ljnigraphics -lz -landroid -ldl -lm -llog -lgcc -lc -lstagefright -lmedia -lutils -lbinder #-lstdc++
  LOCAL_SHARED_LIBRARIES := libavformat libavcodec libswscale libavutil libutils libstagefright libbinder libmedia libstdc++-6
  
  include $(BUILD_SHARED_LIBRARY)
  $(call import-module,ffmpeg-2.1.4/android/arm)
  </code></pre>
  
  <p>And the Application.mk is:</p>
  
  <pre><code>APP_ABI=armeabi-v7a
  #APP_STL=gnustl_static
  APP_STL=stlport_static
  </code></pre></li>
  </ol>
  
  <p>I am not sure what else materials you need, if anything is missing, please let me know, I will upload it.
  Thank you guys very much!!! </p>