`
eagle0824
  • 浏览: 231180 次
  • 性别: Icon_minigender_1
  • 来自: 镇江
社区版块
存档分类
最新评论

Android.mk 基础

 
阅读更多
(转自 http://www.cnblogs.com/lilactutu/archive/2010/12/03/1895537.html)
一个Android.mk file用来向编译系统描述你的源代码。具体来说:该文件是GNU Makefile的一小部分,会被编译系统解析一次或多次。你可以在每一个Android.mk file中定义一个或多个模块,你也可以在几个模块中使用同一个源代码文件。编译系统为你处理许多细节问题。例如,你不需要在你的Android.mk中 列出头文件和依赖文件。NDK编译系统将会为你自动处理这些问题。这也意味着,在升级NDK后,你应该得到新的toolchain/platform支 持,而且不需要改变你的Android.mk文件。


先看一个简单的例子:一个简单的"hello world",比如下面的文件:
sources/helloworld/helloworld.c
sources/helloworld/Android.mk
相应的Android.mk文件会象下面这样:
---------- cut here ------------------
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE
:= helloworld
LOCAL_SRC_FILES := helloworld.c
include $(BUILD_SHARED_LIBRARY)
---------- cut here ------------------
我们来解释一下这几行代码:
LOCAL_PATH := $(call my-dir)
一个 Android.mk file首先必须定义好LOCAL_PATH变量。它用于在开发树中查找源文件。在这个例子中,宏函数’my-dir’, 由编译系统提供,用于返回当前路径(即包含Android.mk file文件的目录)。
include $( CLEAR_VARS)
CLEAR_VARS 由编译系统提供,指定让GNU MAKEFILE为你清除许多LOCAL_XXX变量(例如 LOCAL_MODULE, LOCAL_SRC_FILES, LOCAL_STATIC_LIBRARIES, 等等...),除LOCAL_PATH 。这是必要的,因为所有的编译控制文件都在同一个GNU MAKE执行环境中,所有的变量都是全局的。
LOCAL_MODULE := helloworld
LOCAL_MODULE 变量必须定义,以标识你在Android.mk文件中描述的每个模块。名称必须是唯一的,而且不包 含任何空格。注意编译系统会自动产生合适的前缀和后缀,换句话说,一个被命名为'foo'的共享库模块,将会生成'libfoo.so'文件。
LOCAL_SRC_FILES := helloworld.c
LOCAL_SRC_FILES变量必须包含将要编译打包进模块中的C或C++源代码文件。注意,你不用在这 里列出头文件和包含文件,因为编译系统将会自动为你找出依赖型的文件;仅仅列出直接传递给编译器的源代码文件就好。


在 Android中增加本地程序或者库,这些程序和库与其所载路径没有任何关系,只和它们的Android.mk文件有关系。Android.mk和普通 的Makefile有所不同,它具有统一的写法,主要包含一些系统公共的宏。


在一个Android.mk中可以生成多个可执行程序、动态库和静态库。


1,编译应用程序的模板:
#Test Exe
LOCAL_PATH := $(call my-dir)
#include $(CLEAR_VARS)
LOCAL_SRC_FILES:= main.c
LOCAL_MODULE:= test_exe
#LOCAL_C_INCLUDES :=
#LOCAL_STATIC_LIBRARIES :=
#LOCAL_SHARED_LIBRARIES :=
include $(BUILD_EXECUTABLE)
(菜鸟级别解 释::=是赋值的意思,$是引用某变量的值)LOCAL_SRC_FILES中加入源文件路径,LOCAL_C_INCLUDES 中加入所需要包含的头文件路径,LOCAL_STATIC_LIBRARIES加入所需要链接的静态库(*.a)的名 称,LOCAL_SHARED_LIBRARIES中加入所需要链接的动态库(*.so)的名称,LOCAL_MODULE表示模块最终的名 称,BUILD_EXECUTABLE表示以一个可执行程序的方式进行编译。


2,编译静态库的模板:
#Test Static Lib
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES:= \
helloworld.c
LOCAL_MODULE:= libtest_static
#LOCAL_C_INCLUDES :=
#LOCAL_STATIC_LIBRARIES :=
#LOCAL_SHARED_LIBRARIES :=
include $(BUILD_STATIC_LIBRARY)

一般的和上面相似,BUILD_STATIC_LIBRARY表示编译一个静态库。


3,编译动态库的模板:
#Test Shared Lib
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES:= \
helloworld.c
LOCAL_MODULE:= libtest_shared
TARGET_PRELINK_MODULES := false
#LOCAL_C_INCLUDES :=
#LOCAL_STATIC_LIBRARIES :=
#LOCAL_SHARED_LIBRARIES :=
include $(BUILD_SHARED_LIBRARY)
一般的和上面相似,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文件中,还可以指定最后的目标安装路径,用LOCAL_MODULE_PATH和 LOCAL_UNSTRIPPED_PATH来指定。不同的文件系统路径用以下的宏进行选择:
TARGET_ROOT_OUT:表示根文件系统。
TARGET_OUT: 表示system文件系统。
TARGET_OUT_DATA:表示 data文件系统。
用法如:
CAL_MODULE_PATH:=$(TARGET_ROOT_OUT)
分享到:
评论
1 楼 sammor 2011-12-22  
哥们,你上面写的“在一个Android.mk中可以生成多个可执行程序、动态库和静态库。”指的是什么意思呢?
在一个Android.mk中是否可以一次编译,生成两个静态库呢?包含的源文件是不同的。

相关推荐

    androidmk 转换Android.bp工具方法

    本篇文章将详细介绍如何进行`androidmk`到`Android.bp`的转换,并探讨两者之间的差异以及转换工具的使用方法。 一、`Android.mk`与`Android.bp`概述 1. `Android.mk`:这是Android早期使用的构建系统,基于GNU ...

    Android.mk文件语法规范

    尽管如此,Android.mk仍然是很多现有项目的基础,并且在特定场景下更灵活。理解Android.mk的语法规范对维护老项目或理解Android系统构建过程至关重要。 总结,Android.mk文件是Android系统构建过程中的核心配置文件...

    android.mk文件介绍

    ### Android.mk 文件详解 #### 一、概述 在Android开发中,`Android.mk`是一个非常重要的文件,主要用于定义模块的构建规则。它基于GNU Make工具,是Android NDK(Native Development Kit)的一部分,用于编译C/...

    Android.mk语法说明(android ndk开发)

    除了以上基础配置外,`Android.mk`还支持更多高级特性,包括但不限于: 1. **定义多个module**:可以在同一个`Android.mk`文件中定义多个module,只需要重复上述步骤即可。 2. **使用相同的资源文件**:可以在不同...

    android&mk

    在描述中提到的“最简单的android.mk例子,直接下下来NDK就可以”,这意味着我们有一个基础的`android.mk`示例,无需复杂的配置,只需具备NDK环境即可运行。通常,一个简单的`android.mk`文件会包含以下几个主要部分...

    android.mk FILE

    ### Android.mk 文件详解 #### 一、概述 `Android.mk` 是 Android NDK 中用于描述项目源代码构建规则的关键文件。此文件对于那些希望通过 C/C++ 编写原生代码并将其集成到 Android 应用中的开发者至关重要。下面将...

    android编译系统makefile(Android.mk)写法扫描.pdf

    `Android.mk`文件是Android构建系统中的一个关键部分,它是一个Makefile,用于指导构建过程。本篇将深入探讨`Android.mk`的写法及其在Android编译系统中的作用。 1. **LOCAL_PATH变量**: 在`Android.mk`文件中,`...

    Android编译系统(四)Android编译系统框架分析及main.mk 分析

    然而,Android编译系统相对集中,位于Android源码的build/core目录下,包含了大量的makefile(*.mk)文件和shell脚本。Google为了满足多目标(MultipleTargets)、非递归构建(Non-RecursiveMake)、快速编译测试...

    memtester-4.5.1( Linux & Android 内存压力测试,带Android.mk)

    5. **Android.mk**:在Android开发中,Android.mk是一个Makefile,它告诉Android构建系统如何编译C/C++原生代码。包括memtester在内的原生库或应用都需要这样的文件来指定编译选项、依赖库和目标架构。 6. **内存...

    android编译系统框架分析及main.mk分析

    2. **base_rules.mk**(基础规则Makefile): 定义了一些通用的规则,用于规范化其他Makefile文件中的变量。 3. **config.mk**(配置Makefile): 包含编译参数和编译命令的设置。 4. **definations.mk**(定义...

    Android_mk测试包

    Android_mk测试包,提供:可执行程序,共享库,静态库的基本写法.方便作为调试沟通的基础包

    jni学习资源

    动态加载通常使用`System.loadLibrary()`方法,而静态加载则是在Android.mk或CMakeLists.txt文件中指定。 BinderDemo-master.zip则可能是一个关于Android Binder机制的示例项目。Binder是Android系统中进程间通信...

    websocket_android.rar

    1. **Android NDK基础知识**:NDK是Google提供的一个工具集,允许开发者在Android应用中使用C和C++代码。它可以提高性能,特别是对于计算密集型或图形密集型的应用。NDK提供了交叉编译环境,使得开发者可以在本地...

    鸿蒙_rtthread_Linux_Android驱动开发比较.7z

    开发者需要理解Android的HAL机制,熟悉C++和Java混合编程,以及Android的编译系统如Android.mk和Android.bp。 5. **移植RTOS**:移植RTOS涉及目标平台的硬件适配、中断系统、内存管理等,需要对目标平台的CPU架构和...

    Android特点..初学者多多关注

    1. **Android平台构成**:Android的基础是Linux内核,它包含了中间件层,如SQLite数据库系统,以及一系列关键应用程序,如电话、短信、地图和浏览器。此外,Android提供了一个Java框架,允许开发者使用Java语言进行...

    Android_SDK编译,带自己api的android.jar编译.pdf

    这份文档"Android SDK编译,带自己api的android.jar编译.pdf"详细介绍了如何在Android源码的基础上编译带有自己API的android.jar。以下是整个过程的详细步骤: 1. **添加自定义源代码**: - 在Android源码树的`...

    android编译系统

    ### Android编译系统详解 #### 一、Android编译系统简介 Android的编译系统是其核心组件之一,为开发者提供了高效且稳定的编译环境。...理解和掌握这些基础知识对于深入学习Android编译系统至关重要。

    telecapoland_android.rar_android

    5. **Android.mk** 或 **build.gradle(app)**:如果是旧版的NDK项目,可能会包含Android.mk文件用于原生代码的编译;对于使用Gradle构建的项目,会有另一个app模块的build.gradle文件。 通过分析这个项目,开发者...

    Packt.Android.NDK.Beginner's.Guide.2012

    3. **本地项目结构**:理解Android原生模块的项目结构,包括Android.mk和Application.mk文件的使用,用于构建和配置原生库。 4. **C/C++编程**:复习C/C++基础知识,如数据类型、控制流程、函数、指针等,并介绍...

Global site tag (gtag.js) - Google Analytics