我们在编写JNI代码时有一个可选的文件Application.mk ,这个文件你可以不创建,但是有时候是有必要写一个这样的文件的。

Application.mk文件用于描述应用程序本身的一些属性信息,如应用程序依赖哪些库,应用程序的根目录,应用程序运行在哪些类型指令集的CPU下,还有一些编译选项,

在此文件中定义的东西会应用于整个应用程序包括android.mk也会用到这里面的选项。

如果你不写此文件,会默认编出所有android.mk中写的libs / modules APP_ABI会默认指定为armeabi

下面我们主要介绍APP_ABI的用途。

首先市面上的android智能设备很多也很杂,各种类型各个厂家的芯片,但都是基于某种指令集来开发出来的,这里的ABI(Application Binary Interface)实际就是指应用程序基于哪种指令集来进行编译,官方文档说其实是以下几点不同:

- the CPU instruction set that the machine code should use

  - the endianness of memory stores and loads at runtime

  - the format of executable binaries (shared libraries, programs, etc...)
and what type of content is allowed/supported in them. - various conventions used to pass data between your code and
the system (e.g. how registers and/or the stack are used when functions
are called, alignment constraints, etc...) - alignment and size constraints for enum types, structure fields and
arrays. - the list of function symbols available to your machine code at runtime,
generally from a very specific selected set of libraries.

我们能用到的ABI 也就四种  armeabi armeabi-v7a x86 和mips 前两者最常用到。

在编译的时候你可以指定其中的一种或者几种,如果指定了几种,这时候打包到APK后这个APK被称为“胖二进制”,也就是它包含了几种ABI类型的lib

当APK被安装到设备上的时候,android系统有这样一个机制:

系统支持哪些ABI类型它自己是知道的,它们会将最适合机器性能发挥的ABI类型标记位'primary' 把剩下的也支持的标记为‘secondary’

例如

CPU 工艺为 ARMv5TE-based 的CPU只有'primary'  为armeabi  没有'secondary'
而类型为ARMv7-based的CPU 'primary'  为armeabi-v7a  'secondary'为armeabi

应用程序安装的时候系统首先检查lib/<primary-abi>/libxx.so 如果有的话就将此处的lib随应用程序copy到/data/app/下面这个大家应该知道第三方应用的安装目录

如果没有的话,而机器有secondary ,就检查lib/<secondary-abi>/libxx.so

所以这就是为什么我们不用写application.mk 而应用程序能在amrv7 的机器上面跑得好好的,但是这有可能没有发挥到amrv7的最有效的性能。

所以如果是我写应用程序我会指定两个或更多(当然这可能造成APK体积增大,这个要自己取舍)

另外推荐一个工具查看android系统的硬件信息 z-devicetest  ,可以看到CPU型号等具体信息。

Application.mk中APP_ABI 的含义的更多相关文章

  1. Android: NDK中的Android.mk和Application.mk

    1. 简介 Android.mk  可用来描述要编译的某个具体模块的相关信息.比如:指定编译该模块时所需要的源文件.编译该模块时要链接的库文件.该模块编译完成后生成的库的名字等等.Applicatio ...

  2. Android NDK开发指南---Application.mk文件和android.mk文件

    https://android.googlesource.com/platform/development/+/donut-release/ndk/docs/OVERVIEW.TXT https:// ...

  3. Application.mk语法解释(转)

    转自:http://blog.csdn.net/roland_sun/article/details/46318893 Application.mk是用来描述你的应用程序需要哪些模块,以及这些模块所要 ...

  4. 关于jni编译32位、64位动态库(Android.mk和Application.mk文件)

    最近新项目需要编译64位的动态库,这里记录如何配置. 在jni目录下加入Android.mk和Application.mk文件. Application.mk APP_ABI := armeabi a ...

  5. NDK(9)Application.mk各属性介绍

    本文参考 : http://blog.csdn.net/grimraider/article/details/7587816 在NDK中编写的是本地程序,这个程序的源码在 jni 下,这个本地项目的配 ...

  6. 【转】Application.mk 文件语法规范

    原文网址:http://blog.sina.com.cn/s/blog_4c451e0e0100s6q4.html Application.mk file syntax specification A ...

  7. NDK开发之Application.mk文件详解

    做过NDK开发的同学应该都知道有个Application.mk文件,这是android NDK构建系统使用的一个可选构建文件.它的目的是描述应用程序需要哪些模块,也定义了所有模块的一些通用变量.主要有 ...

  8. Android NDK Application.mk(中文翻译)

    作者:阿宝 更新:2016-08-31 来源:彩色世界(https://blog.hz601.org/2016/07/26/android-NDK-application-mk/index.html) ...

  9. Android NDK学习(二):编译脚本语法Android.mk和Application.mk

    一.Android.mk Android.mk分为一下几部分: LOCAL_PATH:= $(call my-dir), 返回当前文件在系统中的路径,Android.mk文件开始时必须定义该变量. i ...

随机推荐

  1. Windows8 Metro快捷键 | Win8迷

    Windows8 Metro快捷键 | Win8迷   Win + Q : 打开 搜索面板 Win + C : 打开屏幕右侧的Charms简化菜单 Win + 空格 : 切换输入语言和键盘布局  

  2. Decoding BASE64 in ABAP

    Code Gallery Decoding BASE64 in ABAP Skip to end of metadata Created by Frank Klausner, last modifie ...

  3. nginx的sendfile指令的作用

    linux为了解决对读文件产生的从应用空间到内核空间复制数据产生的效率影响引进了零拷贝.什么是零拷贝?这里就不多说了,请参考http://blog.csdn.net/crazyguang/articl ...

  4. eval 捕获dbi错误

    [root@dr-mysql01 ~]# cat t2.pl use DBI; my $dbUser='zabbix'; my $user="root"; my $passwd=& ...

  5. Linux教程:如何在Linux下进行C++开发?

    Linux是一类Unix计算机操作系统的统称,Linux操作系统的内核的名字也是“Linux”, 在Linux下进行C++开发,需要注意许多问题,比如:减少不必要的编辑动作,减少编辑的时间. Wind ...

  6. javascript (十四) dom

    通过 HTML DOM,可访问 JavaScript HTML 文档的所有元素. HTML DOM (文档对象模型) 当网页被加载时,浏览器会创建页面的文档对象模型(Document Object M ...

  7. 眼见为实(2):介绍Windows的窗口、消息、子类化和超类化

    眼见为实(2):介绍Windows的窗口.消息.子类化和超类化 这篇文章本来只是想介绍一下子类化和超类化这两个比较“生僻”的名词.为了叙述的完整性而讨论了Windows的窗口和消息,也简要讨论了进程和 ...

  8. 用MFC实现WebGUI--(CDHtmlDialog)

    自从去年年底一次棘手的界面,开始研究用web做界面到现在大约1年,这一年间不是局限在实现层面,也并非一直研究这一个问题,有很多问题其实不是问题,只是自己没有想清楚或者思想没放开.对于一个界面开发人员, ...

  9. [置顶] ※数据结构※→☆线性表结构(queue)☆============循环队列 顺序存储结构(queue circular sequence)(十)

    循环队列 为充分利用向量空间,克服"假溢出"现象的方法是:将向量空间想象为一个首尾相接的圆环,并称这种向量为循环向量.存储在其中的队列称为循环队列(Circular Queue). ...

  10. 自己定义UITabBarController

    网上大多的自己定义TabBar都是继承View的,项目中要用到path+Tabbat这种话(path用的MMDrawerController这个框架),继承View的Tabbar是无法满足条件的(不是 ...