Android.mk 详解

 

正文

Android中增加本地程序或者库,这些程序与其所在路径没有关系,只和它们的Android.mk有关系。
Android.mk与普通的makefile略有不同,Android.mk具有统一的写法,主要包含一些系统的公共的宏:
Android.mk中选项参考以下文件路径:
build/core/config.mk
各个选项的默认值在以下文件中定义:
build/core/base_config.mk
在一个android.mk中也可以生成多个可执行程序,动态库,静态库。

1.编译程序:

1.1 可执行程序模板:

LOCAL_PATH := $(call my-dir)
include $(CLEAR_PATH)
LOCAL_SRC_FILES := \
                    main.c
LOCAL_MODULE := test_exe
#LOCAL_C_INCLUDES := 
#LOCAL_STATIC_LIBRARIES := 
#LOCAL_SHARED_LIBRARISE := 
include $(BUILD_STATIC_LIBRAR)

LOCAL_PATH:= $(call my-dir)

此行代码在Android.mk的开头,用于给出当前文件的路径:
LOCAL_PATH:
用于在开发树中查找源文件;
宏函数’my-dir’:
由编译系统提供,用于返回当前路径(即包含Android.mk file文件的目录)
---
LOCAL_C_INCLUDES:
表示要加入所需要的包含头文件的路径
---
LOCAL_MODULE:
表示模块最后最终名称
---
LOCAL_STATIC_LIBRARIES:
加入所需要的连接的静态库
---
LOCAL_SHARED_LIBRARISE:
加入所需要的动态库
最后使用include $(BUILD_EXECUTABLE)表示以一个可执行程序的方式进行编译;最终生成的静态库为libtest_static.a;

1.2 编译一个静态库

在Android.mk中编译一个静态库的模板如下所示:

LOCAL_PATH := $(call my-dir)
include $(CLEAR_PATH)
LOCAL_SRC_FILES := \
                    main.c
LOCAL_MODULE := libtest_static
#LOCAL_C_INCLUDES := 
#LOCAL_STATIC_LIBRARIES := 
#LOCAL_SHARED_LIBRARISE := 
include $(BUILD_STATIC_LIBRARY)

1.3 编译一个动态库

在Android.mk中编译一个动态库的模板如下所示:

LOCAL_PATH := $(call my-dir)
include $(CLEAR_PATH)
LOCAL_SRC_FILES := \
                    helloworld.c
LOCAL_MODULE := libtest_shared
TARGET_PRELINK_MODULE := false
#LOCAL_C_INCLUDES := 
#LOCAL_STATIC_LIBRARIES := 
#LOCAL_SHARED_LIBRARISE := 
include $(BUILD_SHARED_LIBRARY)

同样,最终生成的动态库的名称是libtest_shared.so;

1.4 编译结果

可执行程序、静态库、动态库生成的编译结果分别为以下目录:
out/target/product/xxxx/obj/EXECUTABLE
out/target/product/xxxx/obj/STATIC_LIBRARY
out/target/product/xxxx/obj/SHARED_LIBRARY

每一个模块的目标文件夹分别为:

  • 可执行文件:{XXX}_intermediates
  • 静态库: {XXX}_static_intermediates
  • 动态库:{XXX}_shared__intermediates

在编译过程中,可以编译目标机的内容,也可以编译主机的内容,可执行文件、动态库、静态库使用宏分别如下所示 :

include $(BUILD_EXECUTABLE)
include $(BUILD_STATIC_LIBRARY)
include $(BUILD_SHARED_LIBRARY)

编译主机的内容,可执行文件、动态库、静态库使用宏分别如下所示 :

include $(BUILD_HOST_EXECUTABLE)
include $(BUILD_HOST_STATIC_LIBRARY)
include $(BUILD_HOST_SHARED_LIBRARY)

在android.mk中,可以指定最后目标安装路径,使用以下两个宏来指定:

LOCAL_MODULE_PATH := $(TARGET_ROOT_OUT)  
LOCAL_UNSTRIPPED_PATH := $(TARGET_ROOT_OUT_UNSTRIPPED)

不同文件系统使用以下宏来进行选择:

2.安装程序:

除了编译各种内容外,有时还需要向目标文件系统复制一些文件,例如配置脚本、资源文件、预置的程序和库等,也有时需要在目标文件系统中创建目录;
在Android.mk,进行目录创建和安装的实例如下:

LOCAL_PATH := $(call my-dir)
include $(CLEAR_PATH)
xxx(这里使用正常makefile语法来编写copy动作或者创建动作)

详情看:
一个通用的makefile(一)
一个通用的Makefile(二)



http://www.gzh1725.cn/
http://www.dox1148.cn/
http://www.xip7382.cn/
http://www.ngm1905.cn/
http://www.dmb8658.cn/
http://www.nqa8573.cn/
http://www.esz4596.cn/
http://www.nhs9541.cn/
http://www.kfq4961.cn/
http://www.fsi2703.cn/
http://www.ybc8953.cn/
http://www.myy9223.cn/
http://www.paf5803.cn/
http://www.njb8631.cn/
http://www.kzo4326.cn/
http://www.tso8557.cn/
http://www.nwm1536.cn/
http://www.tae4138.cn/
http://www.dxc3579.cn/
http://www.ffp5727.cn/
http://www.lhb4836.cn/
http://www.xdi0113.cn/
http://www.bpa2365.cn/
http://www.fks8445.cn/
http://www.aht8537.cn/
http://www.cun5054.cn/
http://www.gdk7028.cn/
http://www.ypk8666.cn/
http://www.wan2959.cn/
http://www.sit9945.cn/
http://www.zmj4226.cn/
http://www.ccn6233.cn/
http://www.jck8045.cn/
http://www.ckk6213.cn/
http://www.mak1390.cn/
http://www.vii0197.cn/
http://www.pwj5001.cn/
http://www.wvh4263.cn/
http://www.mvg0339.cn/
http://www.yif9712.cn/
http://www.jta0960.cn/
http://www.omx8816.cn/
http://www.nlc4773.cn/
http://www.dep9137.cn/
http://www.vlq7732.cn/
http://www.umg2515.cn/
http://www.kog1435.cn/
http://www.nxf9936.cn/
http://www.hqh7518.cn/
http://www.hij5984.cn/
http://www.vui9639.cn/
http://www.fzl7156.cn/
http://www.wue0833.cn/
http://www.dye6768.cn/
http://www.ryh7899.cn/
http://www.lij0467.cn/
http://www.epv8502.cn/
http://www.lru8400.cn/
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值