Android.mk用法详解

 

简介

 一个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)   #编译之后的文件类型

我试了下是不行的,不知道有什么用处

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值