项目上需要使用第三方预编译静态库,网上资料甚少,之前总结过添加动态共享库,在此以NDK添加libwebrtc_yuv.a为例,记录下期间遇到的问题。
目标:使用libwebrtc_yuv.a相关函数
材料:需要libwebrtc_yuv.a libyuv.a相关静态库
方法:
尝试1. android.mk如下
include $(CLEAR_VARS)
LOCAL_MODULE := webrtc_yuv
LOCAL_SRC_FILES := (LOCAL_PATH)/../webrtc/libwebrtc_yuv.a
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/../webrtc/sources \
$(LOCAL_PATH)/../webrtc/common_video/interface \
$(LOCAL_PATH)/../webrtc/sources/common_video/libyuv/include \
$(LOCAL_PATH)/../webrtc/sources/common_video/jpeg/include \
$(LOCAL_PATH)/../webrtc/sources/common_video \
$(LOCAL_PATH)/../webrtc/sources/modules/interface \
$(LOCAL_PATH)/../webrtc/sources/modules/video_render/main/interface \
$(LOCAL_PATH)/../webrtc/sources/modules/video_render/main/source \
$(LOCAL_PATH)/../webrtc/sources/modules/video_render/main/source/android \
include $(PREBUILT_SHARED_LIBRARY)
LOCAL_STATIC_LIBRARIES := webrtc_yuv
测试用例时,经常会使用这种方法来添加预编译静态库,但是添加之后,遇到问题接踵而来,
1)找不到引用头文件错误
暂时性解决方法是,在外部
LOCAL_C_INCLUDES := $(LOCAL_PATH)/include \
$(LOCAL_PATH)/Transport \
$(LOCAL_PATH)/../webrtc/sources \
$(LOCAL_PATH)/../webrtc/common_video/interface \
$(LOCAL_PATH)/../webrtc/sources/common_video/libyuv/include \
$(LOCAL_PATH)/../webrtc/sources/common_video/jpeg/include \
$(LOCAL_PATH)/../webrtc/sources/common_video \
$(LOCAL_PATH)/../webrtc/sources/modules/interface \
$(LOCAL_PATH)/../webrtc/sources/modules/video_render/main/interface \
$(LOCAL_PATH)/../webrtc/sources/modules/video_render/main/source \
$(LOCAL_PATH)/../webrtc/sources/modules/video_render/main/source/android \
添加头文件路径,问题解决
2)The LOCAL_SRC_FILES for a prebuilt static library should only contain one item错误
解决方法:
include $(CLEAR_VARS)
LOCAL_MODULE := webrtc_yuv
LOCAL_LDLIBS := (LOCAL_PATH)/../webrtc/libwebrtc_yuv.a
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/../webrtc/sources \
$(LOCAL_PATH)/../webrtc/common_video/interface \
$(LOCAL_PATH)/../webrtc/sources/common_video/libyuv/include \
$(LOCAL_PATH)/../webrtc/sources/common_video/jpeg/include \
$(LOCAL_PATH)/../webrtc/sources/common_video \
$(LOCAL_PATH)/../webrtc/sources/modules/interface \
$(LOCAL_PATH)/../webrtc/sources/modules/video_render/main/interface \
$(LOCAL_PATH)/../webrtc/sources/modules/video_render/main/source \
$(LOCAL_PATH)/../webrtc/sources/modules/video_render/main/source/android \
include $(PREBUILT_SHARED_LIBRARY)
3)继续尝试编译,遇到所引用函数:undefined reference to xxx方法 错误
很明显,以上三个错误,都在说明,静态库并未在编译过程中链接到我的Modudle中,并且其export的include方法也没有生效。
放弃这种添加方式,编译成功方式如下:
include $(CLEAR_VARS)
LOCAL_MODULE := WzVoipCall
LOCAL_C_INCLUDES := $(LOCAL_PATH)/include \
$(LOCAL_PATH)/Transport \
$(LOCAL_PATH)/../webrtc/sources \
$(LOCAL_PATH)/../webrtc/common_video/interface \
$(LOCAL_PATH)/../webrtc/sources/common_video/libyuv/include \
$(LOCAL_PATH)/../webrtc/sources/common_video/jpeg/include \
$(LOCAL_PATH)/../webrtc/sources/common_video \
$(LOCAL_PATH)/../webrtc/sources/modules/interface \
$(LOCAL_PATH)/../webrtc/sources/modules/video_render/main/interface \
$(LOCAL_PATH)/../webrtc/sources/modules/video_render/main/source \
$(LOCAL_PATH)/../webrtc/sources/modules/video_render/main/source/android \
LOCAL_LDLIBS += $(LOCAL_PATH)/../webrtc/libwebrtc_yuv.a
LOCAL_LDLIBS += $(LOCAL_PATH)/../webrtc/libyuv.a
为什么用LOCAL_LDLIBS 方法可以,而其实不明白。google之,http://stackoverflow.com/questions/22354041/local-ldlibs-vs-local-ldflags,解释中建议系统相关的库用LOCAL_LDLIBS添加,
如-llog,但现在结果看来,也不一定正确。
BTW,这是一个尝试,当遇到和我同样的问题时,不妨尝试一下此方法。Good luck!
参考:
http://www.cnblogs.com/fengfeng/archive/2013/08/21/3272896.html
http://stackoverflow.com/questions/7663169/android-ndk-adding-static-libraries-to-the-android-mk