简介
一个Android.mk file用来向编译系统描述你的源代码。具体来说:该文件是GNU Makefile的一小部分,会被编译系统解析一次或多次。你可以在每一个Android.mk file中定义一个或多个模块。每个模块属下列类型之一:
1)APK程序,一般的Android程序,编译打包生成apk文件
2)JAVA库,java类库,编译打包生成jar文件
3) C\C++应用程序,可执行的C\C++应用程序
4)C\C++静态库,编译生成C\C++静态库,并打包成.a文件
5)C\C++共享库, 编译生成共享库(动态链接库),并打包成.so, 有且只有共享库才能被安装/复制到您的应用软件(APK)包中。
1.LOCAL_PATH
#每个Android.mk文件都以LOCAL_PATH开始,Build System提供的宏函数 my-dir,此变量返回包含的makefile的路径;
#CLEAR_VARS不会清楚LOCAL_PATH变量;
LOCAL_PATH := $(call my-dir) #定义当前模块的相对路径
2.include $(CLEAR_VARS)
#CLEAR_VARS变量由Build System提供,并指向一个特定的GNU Makefile,可为你清除LOCAL_xxx变量,但不会清除LOCAL_PATH变量;因系统在单一GNU Make执行环境中解析所有构建控制文件,LOCAL_xxx变量是全局的,所以描述每个模块之前,声明此变量,可以清除所有了LOCAL_xxx,这样清理后避免相互影响;
include $(CLEAR_VARS) #清除当前的环境变量
3.LOCAL_SRC_FILES
此变量必须包含要构建到模块中的C/C++源文件列表,不需要列出头文件和包含文件,系统会自动导入依赖;
#编译该模块需要的源文件
写法一
#LOCAL_SRC_FILES := $(call all-c-files-under)
闲的蛋疼也可以这样写:
#编译该模块需要的源文件
LOCAL_C_ALL_FILES := $(call all-subdir-c-files)
LOCAL_SRC_FILES:= $(LOCAL_C_ALL_FILES)
此时源文件可以放在xxx目录下,也可以在xxx目录下在创建src目录,将源文件放到此目录
参考:1.安卓源码中编译C程序
备注
call all-c-files-under:加载所有c文件
写法二
LOCAL_SRC_FILES := test1.c\
test2.c\
test3.c\
4.LOCAL_C_INCLUDES
变量设置头文件的include目录列表
LOCAL_C_INCLUDES := $(LOCAL_PATH)/inc
5.LOCAL_MODULE
#编译生成的目标名
LOCAL_MODULE := wdx_ray
6.末尾
编译生成的文件格式
include $(BUILD_EXECUTABLE)
生成的文件格式
备注:
include $(BUILD_EXECUTABLE):生成应用程序,二进制可执行文件
include $(BUILD_SHARED_LIBRARY):生成动态库(.so),源文件为 c或c++
include $(BUILD_STATIC_LIBRARY):生成静态库(.a)
include $(BUILD_JAVA_LIBRARY):生成jar包,源文件为java
如需要在java文件中调用so文件,如:libabc.so则需在Android.mk文件中添加:
LOCAL_JNI_SHARED_LIBRARIES := libabc
同时,需要在java文件中System.loadLibrary("abc");,注意此时不需要在加上lib前缀
include $(BUILD_PACKAGE):编译出一个apk
综上:
二进制可执行文件
#定义当前模块的相对路径
LOCAL_PATH:= $(call my-dir)
#清除当前的环境变量
include $(CLEAR_VARS)
#编译该模块需要的源文件
LOCAL_SRC_FILES:= $(call all-subdir-c-files)
##变量设置头文件的include目录列表;
LOCAL_C_INCLUDES := $(LOCAL_PATH)/inc
#编译生成的目标名
LOCAL_MODULE := wdx_ray
#编译生成的文件格式
include $(BUILD_EXECUTABLE)
指定目标安装路径
在Android.mk文件中,还可以指定最后的目标安装路径,用LOCAL_MODULE_PATH和LOCAL_UNSTRIPPED_PATH来指定。不同的文件系统路径用以下的宏进行选择:
TARGET_ROOT_OUT:表示根文件系统out/target/product/xxxxx/root。
TARGET_OUT:表示system文件系统out/target/product/xxxx/system。
TARGET_OUT_DATA:表示data文件系统out/target/product/xxxx/data。
TARGET_OUT_SHARED_LIBRARIES:表示out/target/product/xxxx/system/lib
TARGET_OUT_APPS:表示out/target/product/xxxx/system/app
ANDROID_PRODUCT_OUT:out/target/product/xxxx/
TARGET_OUT_JAVA_LIBRARIES:out/target/product/xxxx/system/framework
7.LOCAL_MODULE_PAT
#在当前目录生成该模块文件
LOCAL_MODULE_PATH:=$(LOCAL_PATH)
//指定输出的目录,目录会临时被创建:
LOCAL_MODULE_PATH := $(LOCAL_PATH)/out
如上面的C应用,也会在当前目录生成
#定义当前模块的相对路径
LOCAL_PATH:= $(call my-dir)
#清除当前的环境变量
include $(CLEAR_VARS)
#编译该模块需要的源文件
LOCAL_SRC_FILES:= $(call all-subdir-c-files)
##变量设置头文件的include目录列表;
LOCAL_C_INCLUDES := $(LOCAL_PATH)/inc
#编译生成的目标名
LOCAL_MODULE := wdx_ray
LOCAL_MODULE_PATH:=$(LOCAL_PATH) #在当前目录生成该模块文件
#编译生成的文件格式
include $(BUILD_EXECUTABLE)
目标生成路径
一般的和上面相似,BUILD_SHARED_LIBRARY表示编译一个动态库。
以上三者的生成结果分别在如下,generic依具体target会变:
out/target/product/generic/obj/EXECUTABLE
out/target/product/generic/obj/STATIC_LIBRARY
out/target/product/generic/obj/SHARED_LIBRARY
每个模块的目标文件夹分别为:
可执行程序:XXX_intermediates
静态库: XXX_static_intermediates
动态库: XXX_shared_intermediates
一个Android.mk生成多个目标文件
一个Android.mk生成多个目标文件,只需要在Android.mk下面做如下的操作
LOCAL_PATH:= $(call my-dir) #定义当前模块的相对路径
include $(CLEAR_VARS) #清空当前环境变量
LOCAL_MODULE:= test1 #编译生成的目标名称
LOCAL_C_ALL_FILES := $(call all-c-files-under) #加载所有的文件
LOCAL_SRC_FILES := $LOCAL_C_ALL_FILES
# LOCAL_SRC_FILES := test.c #编译该模块所需要的源文件
# LOCAL_MODULE_PATH:=$(LOCAL_PATH) #在当前目录生成该模块文件
include $(BUILD_EXECUTABLE) #编译之后的文件类型
LOCAL_PATH:= $(call my-dir) #定义当前模块的相对路径
include $(CLEAR_VARS) #清空当前环境变量
LOCAL_MODULE:= test2 #编译生成的目标名称
LOCAL_C_ALL_FILES := $(call all-c-files-under) #加载所有的文件
LOCAL_SRC_FILES := $LOCAL_C_ALL_FILES
# LOCAL_SRC_FILES := test.c #编译该模块所需要的源文件
# LOCAL_MODULE_PATH:=$(LOCAL_PATH) #在当前目录生成该模块文件
include $(BUILD_EXECUTABLE) #编译之后的文件类型
我试了下是不行的,不知道有什么用处