1. 程式人生 > >android 靜態庫和動態庫編譯

android 靜態庫和動態庫編譯

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_MODULES := hello_android_S
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