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. python中的赋值与深浅拷贝

    Python当中对于拷贝,分为两种类型.一种是数字和字符串,另一种就是列表.元组.字典等其他类型了. 一.数字和字符串的拷贝 1.赋值 举个栗子: a1 = 123123 a2 = 123123 # ...

  2. JDBC学习笔记 day1

    JDBC的基本概念: JDBC就是java database connectivity,即java数据库连接. JDBC主要完成的几个任务分别为 与数据库建立一个连接 向数据库发送SQL语句 处理数据 ...

  3. 一个适用于单页应用,返回原始滚动条位置的demo

    如题,最近做一个项目时,由于页面太长,跳转后在返回又回到初始位置,不利于用户体验,需要每次返回到用户离开该页面是的位置.由于是移动端项目,使用了移动端的套ui框架framework7,本身框架的机制是 ...

  4. oracle sequence 异常

    对于数据量较大的序列进行分析 ,出现风险有两种情况1. 序列号随着业务增加变大时,DB的字段空间不足.>>产生后果:插入报错.>>解决方案:给存储序列号的字段进行扩容,且字段长 ...

  5. 这次彻底理解了Object这个属性

    1.实例化Object对象 实例化Object对象的方式有两种:使用Object构造器和使用对象的字面量.例如: var person1 = { name: '李四' }; var person2 = ...

  6. python/ Django之中间件

    python/ Django之中间件 一.中间件 中间件共分为: (1)process_request(self,request) (2)process_view(self, request, cal ...

  7. python基础——匿名函数及递归函数

    python基础--匿名函数及递归函数 1 匿名函数语法 匿名函数lambda x: x * x实际上就是: def f(x): return x * x 关键字lambda表示匿名函数,冒号前面的x ...

  8. .net core页面使用layui的HtmlHelper扩展

    Vino.Core.Extensions.Layui 如果您的.net core 2.0项目使用layui来渲染表单,那么您可以尝试使用这个扩展库可以帮你减少代码和工作量. 项目地址:https:// ...

  9. .Net中集合排序还可以这么玩

    背景: public class StockQuantity { public StockQuantity(string status, DateTime dateTime, int quantity ...

  10. python pygame 安装和运行的一些问题

    1.python安装过程中可以选择自动配置环境变量,可以避免手动配置,但是缺点是如果环境变量有问题,就得自己重新学习配置环境变量. 2.我自己想用python从游戏方面入手,所以在安装pygame过程 ...