android NDK:如何添加預編譯靜態庫 libwebrtc_yuv.a爲例

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章