一、Android.mk

Android.mk分为一下几部分:

  • LOCAL_PATH:= $(call my-dir), 返回当前文件在系统中的路径,Android.mk文件开始时必须定义该变量。
  • include $(CLEAR_VARS), 表明清楚上一次构建过程中的所有全局变量,因为在一个Makefile编译脚本中,会使用到大量的全局变量,使用这行脚本表明需要清除所有的全局变量。
  • LOCAL_SRC_FILES,要编译的C或者CPP的文件,注意这里不需要列举头文件,构建系统会自动帮助开发者依赖这些文件。
  • LOCAL_STATIC_LIBRARIES,所依赖的静态库文件
  • LOCAL_LDLIBS:=-L$(SYSROOT)/usr/lib -llog -lOPENSLES -lGLESv2 -lEGL -lz,指定编译过程所依赖的NDK提供的动态和静态库,SYSROOT变量代表的是NDK_ROOT下面的目录$NDK_ROOT/platforms/android-18/arch-arm,而在这个目录的usr/lib/目录下有很多对应的so的动态库以及.a的静态库。
  • LOCAL_CFLAGS,编译C或者cpp的编译标志,在实际编译的时候会发送给编译器。比如常用的实例是加上-DAUTO_TEST,然后在代码中就可以利用条件判断#ifdef AUTO_TEST来做一些与自动化测试相关的事情。
  • LOCAL_LDFLAGS,链接标志的可选列表,当对目标文件进行链接以生成输出文件的时候,将这些标志带给链接器。该指令与LOCAL_LDLIBS有些类似,一般情况下,该选项会用于指定第三方编译的静态库,LOCAL_LDLIBS经常用于指定系统的库(比如log,OpenGL ES, EGL等)。
  • LOCAL_MODULE,该模块的编译的目标名,用于区分各个模块,名字必须是唯一并且不包含空格的,如果编译目标是so库,那么该so库的名字就是lib项目名.so。
  • include$(BUILD_SHARED_LIBRARY),其实类似的include还有很多,都是构建系统提供的内置变量,该变量的意义就是构建动态库,其他的内置变量还包括如下几种:

  --- BUILD_STATIC_LIBRARY:构建静态库

     --- PREBUILD_STATIC_LIBRARY:对已有的静态库进行包装,使其成为一个模块。

     --- PREBUILD_SHARE_LIBRARY:对已有的动态库进行包装,使其成为一个模块。

   --- BUILD_EXECUTABLE:构建可执行文件。

构建系统提供好的这些内置变量在哪里能看大呢?他们都是在$NDK-ROOT/build/core/目录下,这里会有所有预先定义好的Makefile,开发者include一个变量,实际上就是把对应的Makefile包含到Android.mk中,包括前面提到的CLEAR_VARS,其也是该目录下面的一个Makefile。

  • include$(call all-makefiles-under, $(LOCAL_PATH)), 也是构建系统提供的变量,该命令会返回该目录下所有子目录的Android.mk列表。

LOCAL_SHARED_LIBRARIES 与 LOCAL_LDLIBS,LOCAL_LDFLAGS的区别?

  • LOCAL_LDLIBS :链接的库不产生依赖关系,一般用于不需要重新编译的库,如库不存在,则会报错找不到。且貌似只能链接那些存在于系统目录下本模块需要连接的库。如果某一个库既有动态库又有静态库,那么在默认情况下是链接的动态库而非静态库。如:LOCAL_LDLIBS += -lm –lz –lc -lcutils –lutils –llog …如果你的Android.mk文件中只有这么一行,那么将会采用动态链接。
  • LOCAL_SHARED_LIBRARIES 会生成依赖关系,当库不存在时会去编译这个库。
  • LOCAL_LDFLAGS:这个编译变量传递给链接器一个一些额外的参数,比如想传递给外面的库和库路径给ld,或者传递给ld linker的一些链接参数,-On,-EL{B}(大小端字节序),那么就要加到这个上面,如:LOCAL_LDFLAGS += -L(LOCALPATH)/lib/−lHWrecog–EBEL–On…或者直接加上绝对路径库的全名:LOCALLDFLAGS+=(LOCALPATH)/lib/−lHWrecog–EBEL–On…或者直接加上绝对路径库的全名:LOCALLDFLAGS+=(LOCAL_PATH)/lib/libHWrecog.a –EB{EL} –O{n}

注:如果是非系统的第三方库,貌似只能用LOCAL_LDFLAGS方式,LOCAL_LDLIBS方式不行。

二、Application.mk

Application.mk 分为以下几个部分:

  • APP_ABI :=xxx , 这里的xxx是指不同的平台,可以选填的有x86、mips、armeabi、armeabi-v7a,all等,值得一提的是若选择all会构建出来所有平台的so,如果不填写此项,默认构建为armeabi平台下的库。
  • APP_STL := gnustl_static, NDK构建系统提供了由Android系统给出的最小C++运行时库(/system/lib/libstdc++.so)的C++头文件。然后NDK带有另一个C++实现,开发者可以在自己的应用程序中使用或链接它,定义APP_STL可以选择他们中的一个,包括stlport_static、stlport_shared、gnustl_static.
  • APP_CPPFLAGS := -std=gnu++11 -fexceptions,指定编译过程中的flag,可以在该选项中开启 exception rtti 等特性,但为了效率,最好关闭rtti。
  • NDK_TOOLCHAIN_VERSION = 4.8,指定交叉工具编译链里面的版本号,这里指定使用4.8。
  • APP_PLATFORM:= android-9,指定创建的动态库的平台。
  • APP_OPTIM := release, 该变量是可选的,用来定义‘release’或者‘debug’,‘release’模式是默认的,并会生成高度优化的二进制代码,’debug‘模式生成的是未优化的二进制代码,但是可以检测出很多的bug,经常用于调试阶段,也相当于在ndk-build指令后面加上参数 NDK-DEBUG=1。

三、实例分析

1. 在上面我们了解了Android.mk里的基本语法规则,那么在输入ndk-build之后,,系统到底会使用哪些编译器以及打包器和链接器来编译我们的程序呢?

答:会使用$NDK_ROOT/toolChains/arm-linux-androideabi-4.8/prebuilt/darwin-x86_64/bin/ 目录下面的gcc、g++、ar、ld等工具。同样在该目录下的strip工具将会用于清除so包里面的源码,nm工具可以供开发者查看静态库下的符号列表。

2. 那么进行gcc编译的时候,头文件放在哪里呢?

答:$NDK_ROOT/platforms/android-18/arch-arm/usr/include/ 目录下会存放编译过程所依赖的头文件。

3. 链接过程中,经常使用的log或者OpenGL ES等库又将存放在哪里呢?

答:/platforms/android-18/arch-arm/usr/lib 目录下会存放链接过程中所依赖的库文件。

转载于:https://www.cnblogs.com/renhui/p/9156786.html

Android NDK学习(二):编译脚本语法Android.mk和Application.mk相关推荐

  1. android ndk: aborting . stop,编译时出现android ndk aborting stop怎么破

    编译时出现android ndk aborting stop怎么破 更新时间:2019-10-26 10:26 最满意答案 在报错行前加入: $(call import-add-path, cocos ...

  2. Android编译及编译脚本、Android构建基础学习笔记

    Android编译及编译脚本.Android构建基础学习笔记 Android编译及编译脚本 概述 Android.mk转换成Android.bp 例子(简单Android.mk文件转Android.b ...

  3. 【Android 安装包优化】WebP 应用 ( libwebp 源码下载 | Android.mk 和 Application.mk 构建脚本修改 | libwebp 函数库编译 )

    文章目录 一. libwebp 源码下载 二. libwebp 源码编译脚本修改 三. libwebp 函数库编译 四.参考资料 一. libwebp 源码下载 Google 提供了一系列的 WebP ...

  4. 【Android开发】之编译脚本Makefile编写

    摘抄自:https://blog.csdn.net/SoaringLee_fighting/article/details/84037468 略加部分修改完善. 1.NDK编译C/C++ Native ...

  5. Android NDK学习笔记(转)

    前言 Android系统中的应用程序都是用Java开发的.Android NDK使我们能够在android上使用C/C++开发的原生代码.有两个理由使用NDK: 一是合理的重用现有的代码:二是在程序中 ...

  6. Android.mk和Application.mk文件语法规范说明及举例

    以下英文内容摘自:http://www.kandroid.org/ndk/docs/OVERVIEW.html The Android NDK is a set of tools that allow ...

  7. JNI开发之-Android.mk和Application.mk 详解

    Android.mk和Application.mk 详解 Android.mk 基础知识 变量和宏 NDK 定义的 include 变量 目标信息变量 模块描述变量 NDK 提供的函数宏 Applic ...

  8. Android NDK学习笔记1:基础

    转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/119005718 本文出自[赵彦军的博客] 文章目录 (一)什么是Android N ...

  9. Android NDK 学习汇总

    一,JNI 入门 二,JNI 基础 三,Android.mk 和 CMake 语法 四,Android Studio 中使用 NDK 五,NDK 开发 六,其它

最新文章

  1. 层次遍历二叉树(编程之美3.10)
  2. windows 正在查找bash.exe
  3. 剑桥大学国际学生事务部网站
  4. 《机器学习实战》chapter 07利用AdaBoosting元算法提高分类性能
  5. [蓝桥杯][算法提高VIP]种树(dfs)
  6. 从Spark-Shell到SparkContext的函数调用路径过程分析(源码)
  7. android 多数据图表,Android统计图表MPAndroidChart:为多条统计折线动态更新数据,以高温低温曲线为例【7】...
  8. vb.net与FLASH的完美结合
  9. 用c++实现简单单链表,双链表,二叉树类
  10. MATLAB 轮式机器人轨迹跟踪仿真
  11. excel冻结窗口怎么设置_Win7电脑窗口颜色怎么设置成护眼色?简单几步就能搞定...
  12. 秦纪二 秦始皇帝二十年(甲戌,公元前227年)——摘要
  13. HDU 6143 Killer Names(容斥+组合)
  14. html5如何快速根据psd,微页h5制作工具怎么快速导入PSD源文件?
  15. 只要两步,用Python将地址标记在地图上!
  16. WebRTC Native M96音频基础知识介绍--使用Opus
  17. Sigmastar 方案的相机开发流程和注意点
  18. Niagara基于javascript的控件开发
  19. 网络安全产品(一)FortiSIEM
  20. Apache ECharts数据可视化(连接数据库)

热门文章

  1. linux 修改密码和端口号_WINDOWS/LINUX系统修改管理员密码方法
  2. AtCoder Beginner Contest 182B
  3. win10创建mysql数据库吗_win10 sqlite3创建的数据库文件在哪
  4. 空心等腰三角形java_java打印输出任意大小的等腰三角形,实心菱形,空心菱形,平行四边形...
  5. 苦于E63没有秒表,网上找的不好用,就自己写个简单的
  6. 机构报告:大数据分析提升企业决策水平
  7. 第一节 MongoDB介绍及下载与安装
  8. 产品需求文档写作方法(一)写前准备+梳理需求
  9. 如何利用系统自带的小工具制作特殊字符
  10. Ubuntu+Docker+Tensorflow+GPU安装