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)

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

  • TARGET_ROOT_OUT:根文件系统,路径为:out/target/product/xxxx/root
  • TARGET_OUT:表示system文件系统,路径为:out/target/product/xxxx/system
  • TARGET_OUT_DATA:表示data文件系统,路径为:out/target/product/xxxx/data

2.安装程序:

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

在Android.mk,进行目录创建和安装的实例如下:

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

详情看:

一个通用的makefile(一)

一个通用的Makefile(二)

Android.mk 详解的更多相关文章

  1. 【整理修订】Android.mk详解

    Android.mk详解 1. Android.mk 的应用范围 Android.mk文件是GNU Makefile的一小部分,它用来对Android程序进行编译. 一个Android.mk文件可以编 ...

  2. Android.mk详解

    Android.mk是Android提供的一种makefile文件,用来指定诸如编译生成so库名.引用的头文件目录.需要编译的.c/.cpp文件和.a静态库文件等.要掌握jni,就必须熟练掌握Andr ...

  3. Android编译系统详解(一)

    ++++++++++++++++++++++++++++++++++++++++++ 本文系本站原创,欢迎转载! 转载请注明出处: http://blog.csdn.net/mr_raptor/art ...

  4. Android签名详解(debug和release)

    Android签名详解(debug和release)   1. 为什么要签名 1) 发送者的身份认证 由于开发商可能通过使用相同的Package Name来混淆替换已经安装的程序,以此保证签名不同的包 ...

  5. Android编译详解之lunch命令 【转】

    本文转载自: Android编译详解之lunch命令 (2012-10-08 10:27:55) 转载▼ 标签: it 分类: android内核剖析     Android的优势就在于其开源,手机和 ...

  6. Android Notification 详解(一)——基本操作

    Android Notification 详解(一)--基本操作 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/Notification 文中如有纰 ...

  7. Android Notification 详解——基本操作

    Android Notification 详解 版权声明:本文为博主原创文章,未经博主允许不得转载. 前几天项目中有用到 Android 通知相关的内容,索性把 Android Notificatio ...

  8. Android ActionBar详解

    Android ActionBar详解 分类: Android2014-04-30 15:23 1094人阅读 评论(0) 收藏 举报 androidActionBar   目录(?)[+]   第4 ...

  9. Android 签名详解

    Android 签名详解 AndroidOPhoneAnt设计模式Eclipse  在Android 系统中,所有安装 到 系统的应用程序都必有一个数字证书,此数字证书用于标识应用程序的作者和在应用程 ...

随机推荐

  1. VS 提示:请考虑使用 app.config 将程序集“XXX”从版本“XX”重新映射到版本“XX”,以解决冲突并消除警告。

    具体提示如下: 请考虑使用 app.config 将程序集"System.Web.Http.WebHost, Culture=neutral, PublicKeyToken=31bf3856 ...

  2. 如何在Java中避免equals方法的隐藏陷阱

    摘要 本文描述重载equals方法的技术,这种技术即使是具现类的子类增加了字段也能保证equal语义的正确性. 在<Effective Java>的第8项中,Josh Bloch描述了当继 ...

  3. java程序员最不愿意看到的十件事

     0.遍历结果集并构造对象如果你是个时髦的开发者而不是专业人员,显然你从某篇博客中读过有开发者遇到Hibernate的“性能问题”,因而认为ORM都不好,觉得手动编码“明显更好”.喜欢的话你当然可以用 ...

  4. OAuth是什么?

    一.OAuth的概念 1.问题的提出 2.应用场景 3.规范演进 二.OAuth的运行原理 1.参与者 访问私有数据需要用户参与(客户.用户.服务提供者) 访问公共数据不需要用户参与(客户.服务提供者 ...

  5. 新概念英语(1-11)Is this your shirt ?

    Is this your shirt?Whose shirt is white? A:Whose shirt is that? Is this your shirt, Dave? Dave:No si ...

  6. GIT入门笔记(3)- git中的一些概念和原理

    一.git管理过程中所处的4个阶段: 工作目录(workspace) 暂存区(index) 本地仓库(local repository) 远程仓库(remote repository) 二.工作目录+ ...

  7. 新概念英语(1-67)The weekend

    新概念英语(1-67)The weekend What are the Johnsons going to do at the weekend? A:Hello. Were you at the bu ...

  8. OAuth2.0学习(1-2)OAuth2.0的一个企业级应用场景 - 新浪开放平台微博OAuth2.0认证

    http://open.weibo.com/wiki/%E9%A6%96%E9%A1%B5 开发者可以先浏览OAuth2.0的接口文档,熟悉OAuth2.0的接口及参数的含义,然后我们根据应用场景各自 ...

  9. SpringBoot2.x开发案例之整合Quartz任务管理系统

    基于spring-boot 2.x + quartz 的CRUD任务管理系统,适用于中小项目. 基于spring-boot +quartz 的CRUD任务管理系统: https://gitee.com ...

  10. [js]关于call()和apply()的理解

    call 和 apply 都是为了改变某个函数运行时的 context 即上下文而存在的,换句话说,就是为了改变函数体内部 this 的指向. 因为 JavaScript 的函数存在「定义时上下文」和 ...