尝试了很多方法来解决问题,但都没有成功。这是我的Android.mk文件:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := avcodec
LOCAL_SRC_FILES :=libavcodec.a
include $(PREBUILT_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := avutil
LOCAL_SRC_FILES :=libavutil.a
include $(PREBUILT_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := swscale
LOCAL_SRC_FILES :=libswscale.a
include $(PREBUILT_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := avformat
LOCAL_SRC_FILES :=libavformat.a
include $(PREBUILT_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := avresample
LOCAL_SRC_FILES :=libavresample.a
include $(PREBUILT_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := swresample
LOCAL_SRC_FILES :=libswresample.a
include $(PREBUILT_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := x264
LOCAL_SRC_FILES :=libx264.a
include $(PREBUILT_STATIC_LIBRARY)
include $(CLEAR_VARS)
#------------------------------------------
LOCAL_C_INCLUDES := $(LOCAL_PATH)\
$(LOCAL_PATH)/include
LOCAL_MODULE := media
LOCAL_SRC_FILES := \
P_Decoding.cpp \
P_Encoding.cpp \
wrapper_for_ffmpeg.cpp
LOCAL_CPPFLAGS := -std=c++11 -pthread -frtti -fexceptions
LOCAL_ARM_MODE := arm
LOCAL_STATIC_LIBRARIES := avcodec avutil swscale avformat avresample swresample x264
LOCAL_LDLIBS := -llog -ljnigraphics -landroid -lz -lEGL
LOCAL_CPP_FEATURES := rtti exceptions
include $(BUILD_SHARED_LIBRARY)
在jni文件夹中,包含所有与makefile中的.cpp文件相关的头文件.hpp。此外还包括所有静态.a库和一个名为“include”的文件夹,其中包含了与静态库相关的所有头文件。我正在使用ndk9c版本。 以下是错误日志的一部分:
[armeabi-v7a] Compile++ thumb: media <= P_Decoding.cpp
[armeabi-v7a] Compile++ thumb: media <= P_Encoding.cpp
[armeabi-v7a] Compile++ thumb: media <= wrapper_for_ffmpeg.cpp
/home/pro/android-ndk-r9c/toolchains/llvm-3.3/prebuilt/linux-x86/bin/clang++ 命令用来编译 C++ 代码,生成库文件 libmedia.so。其中 -Wl,-soname 表示指定动态库的 soname,-shared 表示生成共享库,--sysroot 指定系统根目录。代码文件路径为 ./obj/local/armeabi/objs/media/P_Decoding.o 和 ./obj/local/armeabi/objs/media/P_Encoding.o,需要链接的静态库文件为 jni/libavformat.a、jni/libavcodec.a、jni/libavutil.a 和 jni/libswscale.a,在编译的时候需要使用到的动态库文件包括 ./obj/local/armeabi/libgnustl_shared.so、liblog.so、libjnigraphics.so 和 libz.so。命令中还包括其他参数,如 -gcc-toolchain、-no-canonical-prefixes、-target 等。最终生成的库文件路径是 ./obj/local/armeabi/libmedia.so。
jni/P_Decoding.cpp:10: error: undefined reference to 'avcodec_register_all'
jni/P_Decoding.cpp:17: error: undefined reference to 'avcodec_find_decoder'
jni/P_Decoding.cpp:14: error: undefined reference to 'avcodec_find_decoder_by_name'
jni/P_Decoding.cpp:24: error: undefined reference to 'avcodec_alloc_context3'
jni/P_Decoding.cpp:50: error: undefined reference to 'avcodec_open2'
jni/P_Decoding.cpp:56: error: undefined reference to 'avcodec_alloc_frame'
jni/P_Decoding.cpp:76: error: undefined reference to 'sws_getContext'
jni/P_Decoding.cpp:90: error: undefined reference to 'avcodec_decode_video2'
jni/P_Decoding.cpp:104: error: undefined reference to 'sws_scale'
jni/P_Decoding.cpp:118: error: undefined reference to 'avcodec_close'
请帮忙。先提前致谢。
extern "C"
,那么未解析的符号看起来会很混乱。 - Alex Cohn