在android系统源码下编译,一定得写Android.mk,作用和makefile一样,告诉别人你有几个模块,每个模块叫啥,依赖些啥,要编译成个啥。
Android模块一般有以下几种类型:
1)APK程序,一般的Android程序,编译打包生成apk文件
2)JAVA库,java类库,编译打包生成jar文件
3) C\C++应用程序,可执行的C\C++应用程序
4)C\C++静态库,编译生成C\C++静态库,并打包成.a文件
5)C\C++共享库, 编译生成共享库(动态链接库),并打包成.so文件
每个模块在Android.mk都有类似下面的一段说明:
LOCAL_PATH := $(call my-dir) //定义LOCAL_PATH 为当前目录
include $(CLEAR_VARS) //清空之前的LOCAL_XXX 变量,避免影响本模块的编译
LOCAL_MODULE := hello world //模块名称
LOCAL_C_INCLUDES := helloworld.h //头文件
LOCAL_SRC_FILES := helloworld.c //源码
LOCAL_STATIC_LIBRARIES := XXX //本模块依赖的静态库
LOCAL_SHARED_LIBRARIES := XXX //本模块依赖的动态库
LOCAL_LDLIBS := XXX //编译的链接选项,相当于gcc -l后的参数
LOCAL_CFLAGS := XXX //编译选项,相当于gcc -O后面的参数
include $(BUILD_SHARED_LIBRARY) //本模块是个c/c++的动态库,编译完是个so
其他的一些变量:
include $(BUILD_EXECUTABLE) //编译结果是可执行程序
include $(BUILD_STATIC_LIBRARY) //编译结果是静态库
include $(BUILD_SHARED_LIBRARY) //编译成结果是动态库
include $(BUILD_PACKAGE) //编译结果是apk文件
LOCAL_PACKAGE_NAME:= XXX //指明apk文件名
LOCAL_MODULE_TAGS := user/eng/tests/optional
user: 指该模块只在user版本下才编译
eng: 指该模块只在eng版本下才编译
tests: 指该模块只在tests版本下才编译
optional:指该模块在所有版本下都编译