android 库的编译依赖于nkd-build,使用之前请先安装NDK。
编译依赖 Android.mk 和 Application.mk 两个文件。
Android.mk(同时编译静态库和动态库):
LOCAL_PATH := $(call my-dir)
$(info )
$(info ****** Build Library ******)
################################
######### STATIC LIB ###########
################################
include $(CLEAR_VARS)
# 源码路径
CODE1_PATH := ../../code1
CODE2_PATH := ../../code2
CODE3_PATH := ../../code3
# 输出库名
LOCAL_MODULE := hello_android
# 编译平台选项
APP_ABI := armeabi armeabi-v7a x86 mips
LOCAL_CFLAGS := -O3 -Wl,-Bsymbolic
LOCAL_CFLAGS += -ffunction-sections -fdata-sections # 去无用代码
# CODE1 Source
CODE1_C := $(subst $(LOCAL_PATH)/ ,, $(wildcard $(LOCAL_PATH)/$(CODE1_PATH)/src/*.c))
# CODE2 Source
CODE2_CPP := $(subst $(LOCAL_PATH)/ ,, $(wildcard $(LOCAL_PATH)/$(CODE2_PATH)/src/*.cpp))
# CODE3 Source
CODE3_C := $(subst $(LOCAL_PATH)/ ,, $(wildcard $(LOCAL_PATH)/$(CODE3_PATH)/src/*.c))
# 根据平台不同,选择性编译
ifeq ($(APP_ABI), x86)
CODE3_C += $(subst $(LOCAL_PATH)/ ,, $(wildcard $(LOCAL_PATH)/$(CODE3_PATH)/src/X86/*.c))
else
ifeq ($(APP_ABI), armeabi-v7a)
CODE3_C += $(subst $(LOCAL_PATH)/ ,, $(wildcard $(LOCAL_PATH)/$(CODE3_PATH)/src/Neon/*.c))
else
ifeq ($(APP_ABI), armeabi)
CODE3_C += $(subst $(LOCAL_PATH)/ ,, $(wildcard $(LOCAL_PATH)/$(CODE3_PATH)/src/Neon/*.c))
else
ifeq ($(APP_ABI), mips)
CODE3_C += $(subst $(LOCAL_PATH)/ ,, $(wildcard $(LOCAL_PATH)/$(CODE3_PATH)/src/Mips/*.c))
endif
endif
endif
endif
LOCAL_SRC_FILES := $(call CODE1_C, $(LOCAL_PATH))
LOCAL_SRC_FILES += $(call CODE2_CPP, $(LOCAL_PATH))
LOCAL_SRC_FILES += $(call CODE3_C, $(LOCAL_PATH))
LOCAL_C_INCLUDES := \
$(LOCAL_PATH)/$(CODE1_PATH)/Include1 \
$(LOCAL_PATH)/$(CODE1_PATH)/Include2
LOCAL_C_INCLUDES += \
$(LOCAL_PATH)/$(CODE2_PATH)/Include
LOCAL_C_INCLUDES += \
$(LOCAL_PATH)/$(CODE3_PATH)/Include
include $(BUILD_STATIC_LIBRARY)
################################
######### SHARED LIB ###########
################################
include $(CLEAR_VARS)
CODE1_PATH := ../../code1
CODE2_PATH := ../../code2
CODE3_PATH := ../../code3
LOCAL_MODULE := hello_android_shared
LOCAL_STATIC_LIBRARIES := hello_android
APP_ABI := armeabi armeabi-v7a x86 mips
LOCAL_CFLAGS := -O3 -Wl,-Bsymbolic
LOCAL_CFLAGS += -ffunction-sections -fdata-sections # 去无用代码
LOCAL_LDFLAGS := -Wl,--gc-sections
# CODE1 Source
CODE1_C := $(subst $(LOCAL_PATH)/ ,, $(wildcard $(LOCAL_PATH)/$(CODE1_PATH)/src/*.c))
# CODE2 Source
CODE2_CPP := $(subst $(LOCAL_PATH)/ ,, $(wildcard $(LOCAL_PATH)/$(CODE2_PATH)/src/*.cpp))
# CODE3 Source
CODE3_C := $(subst $(LOCAL_PATH)/ ,, $(wildcard $(LOCAL_PATH)/$(CODE3_PATH)/src/*.c))
# 根据平台不同,选择性编译
ifeq ($(APP_ABI), x86)
CODE3_C += $(subst $(LOCAL_PATH)/ ,, $(wildcard $(LOCAL_PATH)/$(CODE3_PATH)/src/X86/*.c))
else
ifeq ($(APP_ABI), armeabi-v7a)
CODE3_C += $(subst $(LOCAL_PATH)/ ,, $(wildcard $(LOCAL_PATH)/$(CODE3_PATH)/src/Neon/*.c))
else
ifeq ($(APP_ABI), armeabi)
CODE3_C += $(subst $(LOCAL_PATH)/ ,, $(wildcard $(LOCAL_PATH)/$(CODE3_PATH)/src/Neon/*.c))
else
ifeq ($(APP_ABI), mips)
CODE3_C += $(subst $(LOCAL_PATH)/ ,, $(wildcard $(LOCAL_PATH)/$(CODE3_PATH)/src/Mips/*.c))
endif
endif
endif
endif
LOCAL_SRC_FILES := $(call CODE1_C, $(LOCAL_PATH))
LOCAL_SRC_FILES += $(call CODE2_CPP, $(LOCAL_PATH))
LOCAL_SRC_FILES += $(call CODE3_C, $(LOCAL_PATH))
LOCAL_C_INCLUDES := \
$(LOCAL_PATH)/$(CODE1_PATH)/Include1 \
$(LOCAL_PATH)/$(CODE1_PATH)/Include2
LOCAL_C_INCLUDES += \
$(LOCAL_PATH)/$(CODE2_PATH)/Include
LOCAL_C_INCLUDES += \
$(LOCAL_PATH)/$(CODE3_PATH)/Include
include $(BUILD_SHARED_LIBRARY)
Application.mk
APP_OPTIM := release
APP_ABI := armeabi-v7a
APP_BUILD_SCRIPT := Android.mk
编译:
linux:ndk-build -B NDK_PROJECT_PATH=. NDK_APPLICATION_MK=./Application.mk
windows:%NDK%/ndk-build.cmd -B NDK_PROJECT_PATH=. NDK_APPLICATION_MK=./Application.mk