Tengo un problema con referencias no resueltas a funciones libavcodec de ffmpeg, hasta ahora no he podido encontrar la respuesta en otros lugares (incluida mi mente) :)FFMpeg en Android, referencias indefinidas a funciones libavcodec, aunque aparece en la línea de comandos
Vamos a describir mi configuración - se necesita espacio, pero es muy básico, podría ser que estoy fallando a ver algunos errores ...
I construyó un conjunto de herramientas con fFmpeg NDK R5, puerto ffmpeg llegué desde http://bambuser.com/opensource (como se recomienda en otras preguntas aquí). Se construye muy bien, por lo que poner varias librerías estáticas en mi proyecto como este:
<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, he creado una carpeta en Android.mk bambuser_ffmpeg enumerar estas bibliotecas como los prediseñados:
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 incluir caminos, 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 muy básico, así:
#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-construir, que compila bien, pero cuando la vinculación se imprime una referencia sin resolver a casi todas las funciones en libavcodec. Parece que solo las funciones de esta lib no están ubicadas:
/home/dimka/src/mobile/android/ffmpegtest/obj/local/armeabi/libavformat.a(allformats.o): In function
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): In functionparse_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): In functionparse_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): In functionflush_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 reference toav_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 reference toav_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 reference to `av_dup_packet'and so on...
No entiendo por qué sucede esto. Traté de ejecutar ndk-build V = 1 para comprobar el comando de enlace real, y libavcodec está sentado allí perfectamente, como debería. Todas las otras libs ffmpeg están allí también.
¿Alguna pista?
¿Hay alguna posibilidad de que su código va a ser liberado de código abierto? ¿O podría ayudarme proporcionando una estructura muy básica (es decir, dónde colocar los archivos .so o .a, cómo llamarlo en la aplicación de Android)? Probé tanto su procedimiento original como la respuesta a continuación, pero ninguno funcionó. Gracias por cualquier pista! – slhck
@slhck Tal vez podría enviarte un correo electrónico con mi Android.mk y el directorio comprimido, aunque no es muy complejo allí, escríbeme a dimsuz en gmail com. Como alternativa, supongo que puedes hacer una pregunta específica aquí, describir tu problema, tal vez alguien encuentre una solución :) – dimsuz