目录结构
/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中添加对应的库依赖关系。