項目上需要使用第三方預編譯靜態庫,網上資料甚少,之前總結過添加動態共享庫,在此以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