FFMpeg en Android, referencias indefinidas a las funciones de libavcodec, aunque aparece en la línea de comandos
Tengo un problema con las referencias no resueltas a las funciones libavcodec de ffmpeg, hasta ahora no he podido encontrar la respuesta en otros lugares (incluida mi mente):)
Permítame describir mi configuración: ocupa espacio, pero es realmente básico, podría ser que no veo ningún error ...
Construí un FFMPeg con ndk r5 toolchain, puerto ffmpeg que obtuve dehttp: //bambuser.com/opensourc (como se recomienda en otras preguntas aquí). Funcionó bien, así que puse varias bibliotecas estáticas en mi proyecto como esta:
<project>/jni/bambuser_ffmpeg/libavcodec.a
<project>/jni/bambuser_ffmpeg/libavformat.a
<project>/jni/bambuser_ffmpeg/libavcore.a
<project>/jni/bambuser_ffmpeg/libavutil.a
A continuación, creé un Android.mk en la carpeta bambuser_ffmpeg para enumerar estas bibliotecas como precompiladas:
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)
A continuación, tengo otro módulo que hace referencia a estas bibliotecas en su Android.mk, configura rutas de inclusión, etc.:
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)
Y finalmente tengo mi ffmpeg_test.cpp que es realmente básico, como este:
#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;
}
Cuando corro ndk-build, se compila bien, pero al vincularlo imprime una referencia sin resolver a casi todas las funciones en libavcodec. Parece que solo las funciones de esta lib no se encuentran:
/ home / dimka / src / mobile / android / ffmpegtest / obj / local / armeabi / libavformat.a (allformats.o): en funciónav_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): En funciónparse_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): En funciónparse_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): En funciónflush_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: referencia indefinida aav_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: referencia indefinida aav_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: referencia indefinida a `av_dup_packet'
y así..
No entiendo por qué sucede esto. Traté de ejecutar ndk-build V = 1 para verificar el comando de enlace real y libavcodec está sentado allí perfectamente bien, como debería ser. Todas las otras bibliotecas ffmpeg también están allí.
¿Alguna pista?