我们在编写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型号等具体信息。

最新文章

  1. Swift3中函数的使用
  2. JavaScript中关于时间的知识点
  3. C语言绘制余弦函数图象
  4. 骑士cms(74cms)个人版 整合UC
  5. git学习笔记02-创建一个仓库提交一个文件-原来就是这么简单
  6. OC基础(14)
  7. angular factory Services provider 自定义服务 工厂
  8. Leetcode#59 Spiral Matrix II
  9. js对象的引用
  10. 18个jQuery Mobile开发贴士和教程
  11. git 安装与使用场景
  12. iphone 如何清空UIWebView的缓存
  13. Java [Leetcode 122]Best Time to Buy and Sell Stock II
  14. Console.WriteLine()与MessageBox.Show()的区别
  15. 尚学堂 JAVA DAY12 java程序执行时内存的分配
  16. ios打包ipa的四种实用方法(.app转.ipa)-备
  17. Oracle静态监听与动态监听概念全解析
  18. git添加本地的项目到git远程管理仓库
  19. Azure系列2.1.6 —— BlobProperties
  20. c#: 简单的日志管理类(TextWriterTraceListener)

热门文章

  1. IIS Web服务扩展中添加ASP.NET4.0
  2. 页面爬虫(获取其他页面HTML)加载到自己页面
  3. 碰撞回避算法(一) Velocity Obstacle
  4. Python 自动化测试报告HTMLTestRunner
  5. FOJ 1607 Greedy division 数学题
  6. spring mvc 接受多对象的处置
  7. dialog开发
  8. Processing.js
  9. oracle在desc表时,name 和type列不能格式化问题(占位过长)
  10. Android开发调试日志工具类[支持保存到SD卡]