目錄結構
/hello
--/include
--/lib/lib.h
--src
--/lib/lib.cpp
--/app/main.cpp
--build
--/jni
--Android.mk
--Application.mk
--Apps.mk
--Include.mk
--Libs.mk
--build.sh
如果有多個依賴庫工程,目錄include和src中結構應該是這樣的。
--/include
--/lib1/lib1.h
--/lib2/lib2.h
--src
--/lib1/lib1.cpp
--/lib2/lib2.cpp
--/app/main.cpp
MK樣例:
#===================================================
#Android.mk
include $(APP_PROJECT_PATH)/Libs.mk
include $(APP_PROJECT_PATH)/Apps.mk
#===================================================
Libs.mk是用來編譯庫工程的腳本文件,Apps.mk是用來配置生成app的腳本文件。
如果有其它三方庫需要編譯,對應的腳本添加到這個文件中,先編譯的順序在前。
#===================================================
#Application.mk
APP_PROJECT_PATH := $(shell pwd)
TARGET_PLATFORM := 'android-14'
APP_CPPFLAGS += -fexceptions
APP_CPPFLAGS += -frtti
APP_STL := gnustl_static
APP_CFLAGS+=\
-DANDROID=1\
-D_GLIBCXX_USE_WCHAR_T=1\
APP_BUILD_SCRIPT := $(APP_PROJECT_PATH)/Android.mk
這裏設置APP_STL,指明使用哪個版本的STL,支持以下四種:
system --> 系統默認的最小支持的C++運行時庫
stlport_static --> 以靜態鏈接的方式使用stlport版本的STL
stlport_shared --> 以動態鏈接的方式使用stlport版本的STL
gnustl_static --> 以靜態鏈接的方式使用gnu版本的STL
#====================================================
編譯的入口文件,指明瞭NDK的版本和要使用的STL版本,不同版本的STL支持的特性不同;
#====================================================
#Apps.mk
LOCAL_PATH:= $(call my-dir)
SRC_PATH_ROOT:=$(LOCAL_PATH)/../../src
include $(CLEAR_VARS)
include $(APP_PROJECT_PATH)/Include.mk # prebuild lib
LOCAL_MODULE := jni-hello
LOCAL_LDLIBS +=../obj/local/$(APP_ABI)/libgnustl_static.a
LOCAL_STATIC_LIBRARIES += \
\#libtest \
libgnustl_static
LOCAL_SHARED_LIBRARIES += libtest
LOCAL_LDFLAGS += \
#find all c files in source dir
local_src_files := $(wildcard $(SRC_PATH_ROOT)/app/*.cpp)
#remove parent path of all c files in source dir
local_src_files := $(local_src_files:$(LOCAL_PATH)/%=%)
LOCAL_SRC_FILES := $(local_src_files)
include $(BUILD_EXECUTABLE)
#===================================================================
LOCAL_STATIC_LIBRARIES:依賴的靜態庫;
LOCAL_SHARED_LIBRARIES:依賴的動態庫;
#===================================================================
#Include.mk
LOCAL_CPP_FEATURES += exceptions
LOCAL_C_INCLUDES += \
$(APP_PROJECT_PATH)/../../include \
\
$(ANDROID_NDK)/sources/cxx-stl/gnu-libstdc++/include\
#=================================================================
項目配置,指明頭文件路徑和各個項目通用的配置;
#=================================================================
#Libs.mk
LOCAL_PATH:= $(call my-dir)
SRC_PATH_ROOT:=$(LOCAL_PATH)/../../src
include $(CLEAR_VARS)
include $(APP_PROJECT_PATH)/Include.mk
LOCAL_MODULE:= libtest
#find all c files in source dir
local_src_files := $(wildcard $(SRC_PATH_ROOT)/lib/*.cpp)
#remove parent path of all c files in source dir
local_src_files := $(local_src_files:$(LOCAL_PATH)/%=%)
LOCAL_SRC_FILES := $(local_src_files)
LOCAL_STATIC_LIBRARIES := gnustl_static
#include $(BUILD_STATIC_LIBRARY)
include $(BUILD_SHARED_LIBRARY)
#===================================================================
編譯的時候,cd到build/jni目錄下,這個目錄也就是APP_PROJECT_PATH了。
有多個依賴庫時,在Libs.mk中仿照現有的添加新的庫,在Apps.mk中添加對應的庫依賴關係。