android NDK:如何添加预编译静态库 libwebrtc_yuv.a为例

版权声明:本文为博主原创文章,欢迎转载,转载请注明出处,向分享精神致敬。 https://blog.csdn.net/qilvmilv/article/details/51921367

项目上需要使用第三方预编译静态库,网上资料甚少,之前总结过添加动态共享库,在此以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

猜你喜欢

转载自blog.csdn.net/qilvmilv/article/details/51921367
今日推荐