`
我爱3G
  • 浏览: 29977 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

Android.mk的用法和基础

 
阅读更多
一个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)
分享到:
评论

相关推荐

    Android系统定制之Android.mk和Android.bp语法详解(精通版).mp4

    2.Android.mk和Android.bp语法大全及使用方法详解 3.Android.mk或Android.bp中引用Android的第三方(jar、aar、so)、Androidx的类库等的使用方法 4.Android.mk或Android.bp编译生成Apk、静态库、动态库、可执行文件等...

    androidmk 转换Android.bp工具方法

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

    Android.mk用法介绍

    Android.mk用法介绍 Android.mk文件是Android系统中的编译配置脚本,类似于Linux中的Makefile。它用于描述源代码结构,并告诉编译系统如何编译和生成目标文件。 Android.mk文件是GNU Makefile的一部分,将被编译...

    Android.mk文件语法规范

    Android.mk文件是Android系统构建过程中不可或缺的一部分,它用于定义模块(module)的编译规则,包括...掌握Android.mk的语法和用法,能够使开发者更加熟练地进行Android原生开发,提高项目的构建效率和跨平台兼容性。

    Android.mk 详解剖析

    这份文档将详细介绍Android.mk的各个方面,帮助你深入理解其功能和用法。 ### 一、Android.mk能编译哪些文件 1. **APK程序**:Android.mk可以用于编译Android应用,包括主Activity、服务、广播接收器等,以及相关...

    Android.mk文档规范

    理解 Android.mk 的基本语法和常用变量对于利用 Android NDK 进行高效开发至关重要。 通过遵循 Android.mk 的规范,开发者可以更轻松地维护大型项目,并确保跨版本的一致性和可维护性。此外,这种标准化的方法也有...

    Android.mk文件语法规范及使用模板.pdf

    ### Android.mk 文件语法规范及使用模板详解 #### 一、引言 在深入探讨`Android.mk`文件的具体语法规范和使用模板之前,我们先来...掌握`Android.mk`文件的使用方法对于深入理解Android NDK的构建机制具有重要意义。

    高通8155p平台QNX+Android9开启ASAN定位内存问题方法Android.mk与Android.bp都有

    高通8155p平台QNX+Android9开启ASAN定位内存问题...不会用的一定要展开下面链接看使用方法,以及编译问题示例,别啥也不懂就开始抱怨。 使用方法参考: https://blog.csdn.net/suixin______/article/details/133713263

    android.mk文件介绍

    ### Android.mk 文件详解 #### 一、概述 在Android开发中,`Android.mk`是一个非常重要的文件,主要用于定义模块的构建规则。...熟悉并掌握`Android.mk`的基本用法对于进行高效的原生开发来说是非常必要的。

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

    ### Android.mk语法说明详解 #### 一、引言 在Android NDK开发中,`Android.mk`文件扮演着至关重要的角色。它不仅定义了要编译的资源,还描述了如何构建这些...希望本文能够帮助您更好地理解和使用`Android.mk`文件。

    详解android.mk中引用第三方库的方法

    本文将详细介绍Android.mk中引用第三方库的方法,包括jar包、*.so文件和*.aar文件三种类型的第三方库。 一、集成第三方jar包 在Android.mk文件中引用第三方jar包需要进行以下步骤: 1. 在项目目录下创建libs目录...

    Android.mk引入第三方jar包和so库文件的方法

    当需要在Android.mk中引入第三方jar包时,通常有几种方法,包括使用LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES变量和LOCAL_STATIC_JAVA_LIBRARIES变量。LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES变量用于指定预编译的静态...

    android.mk FILE

    - 在实际开发中,可以参考 `sources/samples` 目录下的示例文件,这些文件通常包含了详细的注释和说明,有助于更好地理解 `Android.mk` 的使用方法。 - 对于复杂的项目,可能需要在同一个 `Android.mk` 文件中定义多...

    Android.mk文件分析

    ### Android.mk文件分析 在Android开发环境中,...理解并掌握这些宏的使用方法对于构建和管理复杂的原生库至关重要。通过对`Android.mk`文件的学习,开发者可以更好地管理和优化C/C++代码的构建过程,提高开发效率。

    JNI文档资料源码_2020_02_14_3

    Android Studio 中使用 Android.mk 配置静态库 总结 II . 第三方动态库来源 III . 配置 Android.mk 构建脚本路径 IV . 预编译 第三方 静态库 ( Android.mk ) V . 链接静态库 ( 设置静态库依赖 ) VI . Java ...

    jni android.mk编译so模板

    本篇文章将围绕Android.mk文件和JNI的编译过程展开,特别是如何使用ndk-build工具来编译生成.so库,并解决Android Studio中对CMake编译的.so库支持的问题。 Android.mk是Android NDK中的构建文件,用于定义本地库的...

    Android.mk文件中添加第三方jar文件的方法

    添加第三方jar文件到Android.mk文件中需要使用LOCAL_STATIC_JAVA_LIBRARIES和LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES两个语句,而引用第三方jar包需要使用LOCAL_STATIC_JAVA_LIBRARIES和LOCAL_PREBUILT_STATIC_JAVA_...

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

    "Android.mk"是Android Native Development Kit (NDK) 中的一部分,用于定义Android应用程序或库的编译规则和依赖项,这表明memtester可能已经被配置为可以在Android环境下编译和运行。 **标签解析:** - "memtest...

    android智能卡检测程序源码以及apk程序以及libpcsclite.so和libpcsclite.a,还包含android.mk文件

    在Android平台上,智能卡检测程序通常...通过深入研究这个项目,我们可以了解Android平台如何处理智能卡通信,以及如何在Android应用中集成C/C++原生代码,同时掌握Android.mk的用法,提高自己的Android原生开发能力。

Global site tag (gtag.js) - Google Analytics