`

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文件会象下面这样:


我们来解释一下这几行代码:
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,编译应用程序的模板:

(菜鸟级别解释::=是赋值的意思,$是引用某变量的值)LOCAL_SRC_FILES中加入源文件路径,LOCAL_C_INCLUDES 中加入所需要包含的头文件路径,LOCAL_STATIC_LIBRARIES加入所需要链接的静态库(*.a)的名称,LOCAL_SHARED_LIBRARIES中加入所需要链接的动态库(*.so)的名称,LOCAL_MODULE表示模块最终的名称,BUILD_EXECUTABLE表示以一个可执行程序的方式进行编译。
2,编译静态库的模板:
一般的和上面相似,BUILD_STATIC_LIBRARY表示编译一个静态库。
3,编译动态库的模板:
一般的和上面相似,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、静态库、动态库、可执行文件等...

    Android.mk用法介绍

    Android.mk是类似linux中make的Android系统编译配置脚本。

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

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

    JNI文档资料源码_2020_02_14_3

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

    JNI文档资料源码_2020_02_14_2

    【Android NDK 开发】Android.mk 配置动态库 ( Android Studio 配置动态库 | 动态库加载版本限制 | 本章仅做参考推荐使用 CMake 配置动态库 ) 博客地址 : ...

    在android中增加curl的解决方法

    在curl最新版本的官方源代码中其实已经包括了android的编译文件(Android.mk),不过要想编译通过还需要做一些工作。我所使用的curl版本是...创建方法在curl/Android.mk文件头部的注释里有说明。根据这个说明运行co

    如何安装系统认证签名过的APK

    系统中所有使用 android.uid.system 作为共享 UID 的 APK ,都会首先在 manifest 节点中增加android:sharedUserId=“android.uid.system”,然后在 Android.mk 中增加 LOCAL_CERTIFICATE := platform。可以参见 S

    Android之JNI环境配置以及调用

    android 环境下搭建JNI开发环境,以及Android.mk以及Application.mk相关配置文件,以及方法说明。

    新版Android开发教程.rar

    的 Android SDK 提供了在 Android 平台上使用 JaVa 语言进行 Android 应用开发必须的工具和 API 接口。 特性 • 应用程序框架 支持组件的重用与替换 • Dalvik Dalvik Dalvik Dalvik 虚拟机 专为移动设备优化 • ...

    Android 应用开发入门教程(经典版)

    第一篇 Android 系统结构和SDK 使用............................................................................................................................ 5 第1 章 Android 的系统介绍..................

    详解Android的.aar文件生成方法以及使用技巧

    无论是用Eclipse还是用Android Studio做android开发,都会接触到...aar是android module中所有resource文件和编译后的java文件的总压缩包。 区别在于:aar除了包含class文件,还包含resource文件。 在Android Studio中

    Android应用开发入门教程(经典版)

    第一篇Android系统结构和SDK使用............................................................................................................................5 第1章 Android的系统介绍........................

    curl-android:curl静态库为Android预制

    您可以在Android.mk使用curl_static 。 例如,如果您的应用程序定义了libapp.so并使用curl_static ,则您的Android.mk文件应包括以下内容: include $( CLEAR_VARS ) LOCAL_MODULE := app LOCAL_SRC_FILES

    高焕堂<应用框架原理与程序设计>源代码(Eclipse)

    Windows下编译.so文件步骤(这里我使用NDK(android-ndk-1.6_r1)加Cygwin 在windows下编译,如果没有请安装, 注:android-ndk-1.6_r1只支持android 1.6或更早版本,所以这里必须将你的android工程的Target设为1.6): ...

    Android使用jni调用c++/c方法详解

    JniTest是在Android.mk里约束好的,关于Android.mk的编写具体在后面详解。 3、使用javah -jni生成.h文件 编写好jni加载类之后,就要开始生成.h文件了,此文件相当于一个声明文件,起到jni连接c++源

    LeakCanary接入MK编译App过程记录

    因为工作需要,需要对固件中通过MK编译的系统应用接入LeakCanary以检查内存泄露。 几经折腾,终于成功。 接入的LeakCanary 最新版本 2.2版本,免写版本。...解决方法:修改Android.mk --- a/Android.mk +

    auto_generator.py

    使用方法 python auto_generator.py 参数一 参数二 参数三 参数一:代表项目路径,其实就是apk文件所在的文件夹的上级路径 参数二:代表APK所在文件夹的名字 参数三:代表这个APK是编译为可卸载还是不可卸载,...

    android-iperf:编译iperf为Android系统arm64-v8a架构

    adb push dist/iperf2 /data/local/tmpadb shell chmod 755 /data/local/tmp/iperf2用法推荐使用docker和docker-compose进行编译编译iperf v2 cd v2docker-compose up --build编译iperf v3 cd v3docker-compose up ...

    Android应用开发揭秘pdf高清版

    《Android应用开发揭秘》内容全面,不仅详细讲解了Android框架、Android组件、用户界面开发、游戏开发、数据存储、多媒体开发和网络开发等基础知识,而且还深入阐述了传感器、语音识别、桌面组件开发、Android游戏...

    Android本地代码生成器

    只需要在Java文件中声名本地方法,然后运行这个工具,它会逐个检查Java文件,并根据里面的本地方法生成本地文件,和相应的Android.mk文件。并会更新Java文件,添加System.loadLibrary。 接下来所需要做的就是实现...

Global site tag (gtag.js) - Google Analytics