当我们有一份源码需要为android编译出动态库或静态库时,可以在源码目录创建一个build目录,并创建三个文件:Application.mk,一个Android.mk ,一个build.sh来完成编译,这三个文件的内容如下:
Application.mk
此文件主要用于设置以下内容:
1. 设置编译debug库还是release库
2. 指定要编译的芯片平台
APP_PLATFORM := android-14
APP_OPTIM := release
#列出需要编译的芯片平台
APP_ABI := armeabi-v7a
APP_BUILD_SCRIPT := Android.mk
APP_STL := gnustl_static
Android.mk
完成的工作包括:
1. 自动根据配置的源文件路径搜索所有的源文件去编译
2. 配置编译选项
3. 根据配置,编译出动态库或静态库
LOCAL_PATH := $(call my-dir)
$(info )
$(info ****** Build Library ******)
#如果子项目已经有Android.mk文件,则直接包含进来编译即可。同时把后面的部分注释掉
#include ../common/Android.mk
include $(CLEAR_VARS)
# 源码路径
CODE_PATH := ..
# 指定编译静态库=YES, 动态库=NO
GEN_STATIC=YES
# 输出库名称
LOCAL_MODULE := hello_android
# 编译选项
LOCAL_CFLAGS := -O3 -Wl,-Bsymbolic
LOCAL_CFLAGS += -ffunction-sections -fdata-sections
LOCAL_CPPFLAGS := $(LOCAL_CFLAGS)
#指定源文件的路径,所有包含源文件的目录/子目录都要列出来
SRCDIRS := $(CODE_PATH) \
$(CODE_PATH)/src
#指定头文件搜索路径
LOCAL_C_INCLUDES := $(SRCDIRS) \
$(LOCAL_PATH)/$(CODE_PATH)/ \
$(LOCAL_PATH)/$(CODE_PATH)/src
$(info $(LOCAL_C_INCLUDES))
# CODE Source 递归遍历出SRCDIRS中所有目录下的源文件
CODE_C := $(foreach x, $(SRCDIRS), $(subst $(LOCAL_PATH)/ ,, $(wildcard $(LOCAL_PATH)/$(x)/*.c)))
CODE_CC := $(foreach x, $(SRCDIRS), $(subst $(LOCAL_PATH)/ ,, $(wildcard $(LOCAL_PATH)/$(x)/*.cc)))
CODE_CPP := $(foreach x, $(SRCDIRS), $(subst $(LOCAL_PATH)/ ,, $(wildcard $(LOCAL_PATH)/$(x)/*.cpp)))
LOCAL_SRC_FILES := $(call CODE_C, $(LOCAL_PATH))
LOCAL_SRC_FILES += $(call CODE_CC, $(LOCAL_PATH))
LOCAL_SRC_FILES += $(call CODE_CPP, $(LOCAL_PATH))
#当编译动态库时需要指定工程的其他依赖库和库搜索路径
ifeq ($(GEN_STATIC),NO)
#指定库搜索路径
LOCAL_LDLIBS += -L$(LOCAL_PATH)/prebuilt/ -L$(SYSROOT)/usr/lib
#指定依赖的静态库,如果不在库搜索路径里面则需要通过$(LOCAL_PATH)指定绝对路径
#LOCAL_STATIC_LIBRARIES:=$(LOCAL_PATH)/lib/libxxx.a
#指定依赖的动态库
LOCAL_LDLIBS += -llog -lz
endif
#根据配置选择编译静态库或动态库
ifeq ($(GEN_STATIC),YES)
include $(BUILD_STATIC_LIBRARY)
else
include $(BUILD_SHARED_LIBRARY)
endif
build.sh
#!bin/sh
ndk-build -B NDK_PROJECT_PATH=. NDK_APPLICATION_MK=./Application.mk
此时打开终端进入build目录,执行
sh build.sh
万事大吉!
网友评论