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. LAMP 搭建

    p { margin-bottom: 0.25cm; line-height: 120% } LAMP 搭建 承 Ubuntu 17.10.1安装, 定制. 参考 电子工业出版社, Ubuntu完美应 ...

  2. python 人工智能资源推荐

    原创 2017-06-05 玄魂工作室 玄魂工作室 我翻了翻我自己曾经看过的书,还是放弃了推荐.原因很简单,我对这个领域并不是很熟悉,我来推荐资源有点误人子弟.so,简单推点其他人建议给我的内容,希望 ...

  3. Python内置函数(40)——dir

    英文文档: dir([object]) Without arguments, return the list of names in the current local scope. With an ...

  4. iot会议纪要 20180105

    1.需求概述设备 <-->物接入 <--> 云端认证授权协议解析主题 端点endpoint(地址)->设备thing(用户)->身份principal(密码)-&g ...

  5. kafka--producer 发布消息

    1. 写入方式 producer 采用 push 模式将消息发布到 broker,每条消息都被 append 到 patition 中,属于顺序写磁盘(顺序写磁盘效率比随机写内存要高,保障 kafka ...

  6. python CSS

    CSS 一. css的四种引入方式   1.行内式  2.嵌入式  3. 链接式 将一个.css文件引入到HTML文件中 1 <link href="mystyle.css" ...

  7. Why deep learning?

    1. 深度学习中网络越深越好么? 理论上说是这样的,因为网络越深,参数也越多,拟合能力也越强(但实际情况是,网络很深的时候,不容易训练,使得表现能力可能并不好). 2. 那么,不同什么深度的网络,在参 ...

  8. requests+xpath+map爬取百度贴吧

    # requests+xpath+map爬取百度贴吧 # 目标内容:跟帖用户名,跟帖内容,跟帖时间 # 分解: # requests获取网页 # xpath提取内容 # map实现多线程爬虫 impo ...

  9. CSS3中不常用但很有用的属性-1

    内容来源于W3Cschool和<图解CSS3核心技术与案例实战> 1.:target选择器 URL 带有后面跟有锚名称 #,指向文档内某个具体的元素.这个被链接的元素就是目标元素(targ ...

  10. svg 五花 元辅音 助读器

    如图,使用svg 创建5个圆,中间 辅音字母,外圈 元音字母 以及 示例单词. 可以使用  提交 按钮 进行更新