Неопределенные ссылки при использовании ffmpeg 2.1.1 для Android

Я строю ffmpeg по той же схеме, что и assembly halfninja : сделайте main ffmpeg доступным с Java через JNI. Я построил ffmpeg со следующими параметрами:

 ./configure \ --prefix=$PREFIX \ --disable-shared \ --enable-static \ --disable-doc \ --disable-ffmpeg \ --disable-ffplay \ --disable-ffprobe \ --disable-ffserver \ --disable-doc \ --disable-symver \ --cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \ --target-os=linux \ --arch=arm \ --enable-cross-compile \ --sysroot=$SYSROOT \ --extra-cflags="-Os -fpic $ADDI_CFLAGS" \ --extra-ldflags="$ADDI_LDFLAGS" 

$PREFIX , TOOLCHAIN , … устанавливается в соответствующие папки из моего NDK. $ADDI_CFLAGS устанавливается в -marm и $ADDI_LDFLAGS а $ADDITIONAL_CONFIGURE_FLAGS оба не установлены. Создаются созданные статические библиотеки:

  $ ls -1 android / arm / lib /
 libavcodec.a
 libavdevice.a
 libavfilter.a
 libavformat.a
 libavutil.a
 libswresample.a
 libswscale.a
 pkg-config 

Я выставляю их с файлом Android.mk , ffmpeg создается в $NDK/sources/ffmpeg-2.1.1 :

 LOCAL_PATH:= $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE:= libavdevice LOCAL_SRC_FILES:= lib/libavdevice.a LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include include $(PREBUILT_STATIC_LIBRARY) include $(CLEAR_VARS) LOCAL_MODULE:= libavcodec LOCAL_SRC_FILES:= lib/libavcodec.a LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include include $(PREBUILT_STATIC_LIBRARY) include $(CLEAR_VARS) LOCAL_MODULE:= libavformat LOCAL_SRC_FILES:= lib/libavformat.a LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include include $(PREBUILT_STATIC_LIBRARY) include $(CLEAR_VARS) LOCAL_MODULE:= libswscale LOCAL_SRC_FILES:= lib/libswscale.a LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include include $(PREBUILT_STATIC_LIBRARY) include $(CLEAR_VARS) LOCAL_MODULE:= libavutil LOCAL_SRC_FILES:= lib/libavutil.a LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include include $(PREBUILT_STATIC_LIBRARY) include $(CLEAR_VARS) LOCAL_MODULE:= libavfilter LOCAL_SRC_FILES:= lib/libavfilter.a LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include include $(PREBUILT_STATIC_LIBRARY) include $(CLEAR_VARS) LOCAL_MODULE:= libwsresample LOCAL_SRC_FILES:= lib/libswresample.a LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include include $(PREBUILT_STATIC_LIBRARY) 

Таким образом, до сих пор все выглядит хорошо. Теперь я пытаюсь построить двоичный эквивалент ffmpeg как статическую библиотеку. Я скопировал (и пока не изменил ни одного символа) ffmpeg.c , ffmpeg.h , cmdutils.c , cmdutils.h , ffmpeg_opt.c и ffmpeg_filter.c в моей папке ffmpeg_filter.c . У меня также есть два непосредственно связанных с JNI файла в этой папке (скопированные из сборки halfninja, я просто изменил имя пакета). Вот соответствующий Android.mk :

 LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_C_INCLUDES := /Applications/android-ndk-r9b/sources/ffmpeg-2.1.1 LOCAL_CFLAGS := -Wdeprecated-declarations LOCAL_MODULE := videokit ANDROID_LIB := -landroid LOCAL_LDLIBS += -llog -ljnigraphics -lz LOCAL_SRC_FILES := videokit/com_rfc_video_ffmpeg_Videokit.c videokit/ffmpeg.c videokit/cmdutils.c videokit/ffmpeg_opt.c videokit/ffmpeg_filter.c LOCAL_SHARED_LIBRARIES := libavdevice libavformat libavfilter libavcodec libwscale libavutil libswresample libswscale libpostproc include $(BUILD_SHARED_LIBRARY) $(call import-module,ffmpeg-2.1.1/android/arm) 

Все компилируется отлично, но не связывается. Вот первые ошибки:

  [armeabi] SharedLibrary: libvideokit.so
 /Applications/android-ndk-r9b/toolchains/arm-linux-androideabi-4.6/prebuilt/darwin-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.6/../../ .. /../arm-linux-androideabi/bin/ld: ./obj/local/armeabi/objs/videokit/videokit/cmdutils.o: в функции print_all_libs_info.constprop.5: jni / videokit / cmdutils.c: 1063: error: неопределенная ссылка на 'swresample_version'
 /Applications/android-ndk-r9b/toolchains/arm-linux-androideabi-4.6/prebuilt/darwin-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.6/../../ .. /../arm-linux-androideabi/bin/ld: ./obj/local/armeabi/objs/videokit/videokit/cmdutils.o: в функции print_all_libs_info.constprop.5: jni / videokit / cmdutils.c: 1063: error: неопределенная ссылка на 'swresample_configuration'
 /Applications/android-ndk-r9b/toolchains/arm-linux-androideabi-4.6/prebuilt/darwin-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.6/../../ .. /../arm-linux-androideabi/bin/ld: ./obj/local/armeabi/objs/videokit/videokit/cmdutils.o: в функции opt_default: jni / videokit / cmdutils.c: 558: error: undefined reference to 'swr_get_class'
 /Applications/android-ndk-r9b/toolchains/arm-linux-androideabi-4.6/prebuilt/darwin-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.6/../../ .. /../arm-linux-androideabi/bin/ld: ./obj/local/armeabi/objs/videokit/videokit/cmdutils.o: в функции opt_default: jni / videokit / cmdutils.c: 561: error: undefined reference to 'swr_alloc'
 /Applications/android-ndk-r9b/toolchains/arm-linux-androideabi-4.6/prebuilt/darwin-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.6/../../ .. /../arm-linux-androideabi/bin/ld: ./obj/local/armeabi/objs/videokit/videokit/cmdutils.o: в функции opt_default: jni / videokit / cmdutils.c: 563: error: undefined reference to 'swr_free'
 /Applications/android-ndk-r9b/toolchains/arm-linux-androideabi-4.6/prebuilt/darwin-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.6/../../ .. /../arm-linux-androideabi/bin/ld: ./obj/local/armeabi/objs/videokit/videokit/ffmpeg_opt.o: в функции show_help_default: jni / videokit / ffmpeg_opt.c: 2464: error: undefined reference to 'swr_get_class' 

Я не понимаю, что эти функции определены и доступны в libswresample.a , с которыми я связываюсь:

  arm-linux-androideabi-nm /Applications/android-ndk-r9b/sources/ffmpeg-2.1.1/android/arm/lib/libswresample.a |  grep -i -e swr_get_class -e swresample_version
 000001d4 T swr_get_class
 00000178 T swresample_version 

Что я делаю неправильно? Есть ли другой, возможно, более простой способ открыть ffmpeg как статическую библиотеку, доступную через JNI? (Я не использую halfninja, потому что мне нужно хотя бы ffmpeg 1.1, а у него – 0,9).

Ваши имена немного скремблировались: в одном месте вы назвали его libwsresample , в другом месте libswresample .

Проверьте все имена для согласованности.