在从事Android开发的过程中,经常会使用到用c或c++编写的第三方的静态库,比如对接第三方时,对方不希望提供源码,又比如在我们的编译环境下,无法编译某个库。这个时候就可以用静态库来编译成动态库so。之前在网络上看过很多方法,似乎都编译失败,因此这里有必要记录一下。
下面以从ffmpeg社区获取到的静态库和头文件的例子,来讲解将静态库编译成动态库so。
编写的Android.mk
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := libavcodec
LOCAL_SRC_FILES := ./libavcodec.a
LOCAL_MODULE_CLASS := STATIC_LIBRARIES
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE_SUFFIX := .a
include $(BUILD_PREBUILT)
include $(CLEAR_VARS)
LOCAL_MODULE := libavfilter
LOCAL_SRC_FILES := ./libavfilter.a
LOCAL_MODULE_CLASS := STATIC_LIBRARIES
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE_SUFFIX := .a
include $(BUILD_PREBUILT)
include $(CLEAR_VARS)
LOCAL_MODULE := libavformat
LOCAL_SRC_FILES := ./libavformat.a
LOCAL_MODULE_CLASS := STATIC_LIBRARIES
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE_SUFFIX := .a
include $(BUILD_PREBUILT)
include $(CLEAR_VARS)
LOCAL_MODULE := libavutil
LOCAL_SRC_FILES := ./libavutil.a
LOCAL_MODULE_CLASS := STATIC_LIBRARIES
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE_SUFFIX := .a
include $(BUILD_PREBUILT)
include $(CLEAR_VARS)
LOCAL_MODULE := libswscale
LOCAL_SRC_FILES := ./libswscale.a
LOCAL_MODULE_CLASS := STATIC_LIBRARIES
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE_SUFFIX := .a
include $(BUILD_PREBUILT)
include $(CLEAR_VARS)
LOCAL_MODULE := libswresample
LOCAL_SRC_FILES := ./libswresample.a
LOCAL_MODULE_CLASS := STATIC_LIBRARIES
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE_SUFFIX := .a
include $(BUILD_PREBUILT)
# include $(PREBUILT_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := ffmpeg_3.2.4
LOCAL_MODULE_CLASS := SHARED_LIBRARIES
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE_SUFFIX := .so
LOCAL_C_INCLUDES := ffmpeg \
ffmpeg/libavcodec \
ffmpeg/libavformat \
ffmpeg/libavresample \
ffmpeg/libavutil \
ffmpeg/libpostproc \
ffmpeg/libswresample \
ffmpeg/libswscale
LOCAL_LDLIBS += -lm -lz
LOCAL_WHOLE_STATIC_LIBRARIES := libavcodec
LOCAL_WHOLE_STATIC_LIBRARIES += libavfilter
LOCAL_WHOLE_STATIC_LIBRARIES += libavformat
LOCAL_WHOLE_STATIC_LIBRARIES += libavutil
LOCAL_WHOLE_STATIC_LIBRARIES += libswscale
LOCAL_WHOLE_STATIC_LIBRARIES += libswresample
include $(BUILD_SHARED_LIBRARY)