У меня проблема с неразрешенными ссылками на функции ffmpeg libavcodec, до сих пор не удалось найти ответ в других местах (включая мой разум):)
Позвольте мне описать мою установку - она занимает пространство, но на самом деле является базовой, возможно, я не вижу ошибки...
Я построил FFMPeg с помощью toolchain ndk r5, порт ffmpeg, который я получил от http://bambuser.com/opensource (как это рекомендовано в других вопросах здесь). Он построил отлично, поэтому я поместил несколько статических библиотек в свой проект следующим образом:
<project>/jni/bambuser_ffmpeg/libavcodec.a
<project>/jni/bambuser_ffmpeg/libavformat.a
<project>/jni/bambuser_ffmpeg/libavcore.a
<project>/jni/bambuser_ffmpeg/libavutil.a
Затем я создал Android.mk в папке bambuser_ffmpeg, чтобы перечислить эти библиотеки как готовые:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := bambuser-libavcore
LOCAL_SRC_FILES := libavcore.a
include $(PREBUILT_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := bambuser-libavformat
LOCAL_SRC_FILES := libavformat.a
include $(PREBUILT_STATIC_LIBRARY)
(same for other two libs)
Затем у меня есть еще один модуль, который ссылается на эти библиотеки в Android.mk, устанавливает пути включения и т.д.:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := ffmpegtest
LOCAL_STATIC_LIBRARIES := bambuser-libavcodec bambuser-libavcore bambuser-libavformat bambuser-libavutil
LOCAL_SRC_FILES := ffmpeg_test.cpp
LOCAL_C_INCLUDES := $(LOCAL_PATH)/../bambuser_ffmpeg/include
LOCAL_LDLIBS := -llog -lz
include $(BUILD_SHARED_LIBRARY)
И, наконец, у меня есть ffmpeg_test.cpp, который действительно базовый, например:
#include <jni.h>
extern "C" {
#include <libavcodec/avcodec.h>
#include <libavformat/avformat.h>
}
extern "C" {
JNIEXPORT jint JNICALL Java_com_the7art_ffmpegtest_PaintThread_testFFMpeg(JNIEnv* env, jobject obj, jstring fileName);
}
JNIEXPORT jint JNICALL Java_com_the7art_ffmpegtest_PaintThread_testFFMpeg(JNIEnv* env, jobject obj, jstring fileName)
{
av_register_all();
return 0;
}
Когда я запускаю ndk-build, он компилируется отлично, но при связывании он печатает неразрешенную ссылку почти на каждую функцию в libavcodec. Похоже, что только эти функции lib не могут быть расположены:
/home/dimka/src/mobile/android/ffmpegtest/obj/local/armeabi/libavformat.a(allformats.o): В функции
av_register_all': /home/dimka/work/suzy/tmp/ffmpeg-android/ffmpeg/libavformat/allformats.c:47: undefined reference to
avcodec_register_all ' /home/dimka/src/mobile/android/ffmpegtest/obj/local/armeabi/libavformat.a(utils.o): В функцииparse_frame_rate': /home/dimka/work/suzy/tmp/ffmpeg-android/ffmpeg/libavformat/utils.c:3240: undefined reference to
av_parse_video_rate ' /home/dimka/src/mobile/android/ffmpegtest/obj/local/armeabi/libavformat.a(utils.o): В функцииparse_image_size': /home/dimka/work/suzy/tmp/ffmpeg-android/ffmpeg/libavformat/utils.c:3234: undefined reference to
av_parse_video_size ' /home/dimka/src/mobile/android/ffmpegtest/obj/local/armeabi/libavformat.a(utils.o): В функцииflush_packet_queue': /home/dimka/work/suzy/tmp/ffmpeg-android/ffmpeg/libavformat/utils.c:1277: undefined reference to
av_free_packet ' /home/dimka/work/suzy/tmp/ffmpeg -android/ffmpeg/libavformat/utils.c:1283: undefined ссылка наav_free_packet' /home/dimka/src/mobile/android/ffmpegtest/obj/local/armeabi/libavformat.a(utils.o): In function
get_audio_frame_size ': /home/dimka/work/suzy/tmp/ffmpeg -android/ffmpeg/libavformat/utils.c:766: undefined ссылка наav_get_bits_per_sample' /home/dimka/src/mobile/android/ffmpegtest/obj/local/armeabi/libavformat.a(utils.o): In function
ff_interleave_add_packet ': /home/dimka/work/suzy/tmp/ffmpeg -android/ffmpeg/libavformat/utils.c:2909: undefined ссылка на `av_dup_packet 'и т.д.
Я не могу понять, почему это происходит. Я попытался запустить ndk-build V = 1, чтобы проверить фактическую команду связывания, и libavcodec сидит там совершенно правильно, как и должно. Все остальные ffmpeg libs тоже есть.
Любые подсказки?