title: FFMPEG in Android NDK - could not load library "libavfilter.so"
body: <p>I'm trying to use FFMPEG to crop a video using the Android NDK. I can successfully build ffmpeg, but I'm having problems with libavfilter. As soon as I include it in my LOCAL_SHARED_LIBRARIES in Android.mk, then I get this UnsatisfiedLinkError:</p>
  
  <pre><code>java.lang.UnsatisfiedLinkError: dlopen failed: could not load library "libavfilter.so" needed by "videocrop.so"; caused by cannot locate symbol "avcodec_find_best_pix_fmt_of_2" referenced by "libavfilter.so"...
          at java.lang.Runtime.loadLibrary(Runtime.java:371)
          at java.lang.System.loadLibrary(System.java:989)
  </code></pre>
  
  <p>(I'm trying to load my library in a static initializer on the Java side with System.loadLibrary).</p>
  
  <p>The "avcodec_find_best_pix_fmt_of_2" function exists in libavcodec/avcodec.h, so I don't know why it can't locate it. The libavfilter.so file (as well as all the other libraries) seems to be building just fine and is located in the libs/ folder. I've tried editing the FFMPEG configuration and rebuilding, and also tried changing the the LOCAL_C_INCLUDES in Android.mk to include libavcodec's header files, but no luck with anything.</p>
  
  <p>Here's my Android.mk for my module:</p>
  
  <pre><code>LOCAL_PATH:= $(call my-dir)
  
  include $(CLEAR_VARS)
  
  LOCAL_MODULE := videocrop
  LOCAL_CFLAGS :=
  LOCAL_SRC_FILES := VideoCrop.c
      LOCAL_C_INCLUDES += $(LOCAL_PATH)/../ffmpeg/ffmpeg/$(TARGET_ARCH)/include/libavcodec/
      LOCAL_SHARED_LIBRARIES := libavformat libavutil libavcodec libavfilter
  
      LOCAL_LDLIBS := -llog
      LOCAL_LDFLAGS +=-ljnigraphics
  
      include $(BUILD_SHARED_LIBRARY)
  </code></pre>
  
  <p>And here's my Android.mk for the ffmpeg libraries themselves, although its pretty straightforward:</p>
  
  <pre><code>LOCAL_PATH := $(call my-dir)
  
  include $(CLEAR_VARS)
  LOCAL_MODULE := libavfilter
  LOCAL_SRC_FILES := ffmpeg/$(TARGET_ARCH_ABI)/lib/$(LOCAL_MODULE).so
  LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/ffmpeg/$(TARGET_ARCH_ABI)/include
  include $(PREBUILT_SHARED_LIBRARY)
  
  include $(CLEAR_VARS)
  LOCAL_MODULE := libswscale
  LOCAL_SRC_FILES := ffmpeg/$(TARGET_ARCH_ABI)/lib/$(LOCAL_MODULE).so
  LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/ffmpeg/$(TARGET_ARCH_ABI)/include
  include $(PREBUILT_SHARED_LIBRARY)
  
  include $(CLEAR_VARS)
  LOCAL_MODULE := libavcodec
  LOCAL_SRC_FILES := ffmpeg/$(TARGET_ARCH_ABI)/lib/$(LOCAL_MODULE).so
  LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/ffmpeg/$(TARGET_ARCH_ABI)/include
  include $(PREBUILT_SHARED_LIBRARY)
  
  include $(CLEAR_VARS)
  LOCAL_MODULE := libavformat
  LOCAL_SRC_FILES := ffmpeg/$(TARGET_ARCH_ABI)/lib/$(LOCAL_MODULE).so
  LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/ffmpeg/$(TARGET_ARCH_ABI)/include
  include $(PREBUILT_SHARED_LIBRARY)
  
  include $(CLEAR_VARS)
  LOCAL_MODULE := libavutil
  LOCAL_SRC_FILES := ffmpeg/$(TARGET_ARCH_ABI)/lib/$(LOCAL_MODULE).so
  LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/ffmpeg/$(TARGET_ARCH_ABI)/include
  include $(PREBUILT_SHARED_LIBRARY)
  
  LOCAL_PATH:= $(call my-dir)
  </code></pre>
  
  <p>I'm at wit's end. If anyone has any ideas it would be much appreciated.</p>