对于Android NDK编译器ARM和Thumb模式的理解
编译NDK项目时,编译器无法识别arm汇编,设置LOCAL_ARM_MODE := arm后问题解决,
NDK文档上对LOCAL_ARM_MODE的说明如下:
LOCAL_ARM_MODE
By default, ARM target binaries are generated in 'thumb' mode, where each instruction are 16-bit wide, and linked with /thumb STL libraries. You can define this variable to 'arm
' if you want to force the generation of the module's object files in 'arm' (32-bit instructions) mode. E.g.:
LOCAL_ARM_MODE := arm
Note that you can also instruct the build system to only build specific sources in ARM mode by appending an '.arm
' suffix to its source file name. For example, with:
LOCAL_SRC_FILES := foo.c bar.c.arm
Tells the build system to always compile 'bar.c
' in ARM mode, and to build foo.c
according to the value of LOCAL_ARM_MODE.
NOTE: Setting APP_OPTIM to 'debug
' in your Application.mk
will also force the generation of ARM binaries as well. This is due to bugs in the toolchain debugger that don't deal too well with thumb code.
文档上的说明比较简略,我在网上找了篇不错的文章,如下:
原文链接:http://blog.k-res.net/archives/1291.html
以前在做Symbian的时候,曾经研究过ARM CPU的指令集问题,ARM处理器支持两套指令集,即ARM和Thumb。ARM为32位指令集而Thumb为16位指令集,理论上32位可以提供更快的执行速度但会生成更大的二进制执行文件,而16位的Thumb则恰恰相反,省地但慢,这也正是体现出了ARM对于嵌入式设备的专业性。对于我这种牺牲一切换速度的理念来说,当时就留下了ARM就比Thumb快的印象,以致于现在在做Android NDK原生开发时,也是优先用ARM指令集。(这个可以通过在Android.mk中加入LOCAL_ARM_MODE := arm控制,默认情况下NDK使用Thumb指令集)
但是最近在Xcode编译iOS项目时,注意到同为ARM处理器的苹果设备,使用的是Thumb指令集,而且好像还是某种新版本的Thumb指令集,小搜索了一下看到有人说这种armv7引入的叫做Thumb-2的指令集要比arm指令集更好!于是又重新搜索更新了一下大脑知识库…
armv7对于苹果设备来说,意味着iPhone 3GS以上级别的设备的CPU,而目前主流的Android设备几乎全是armv7处理器的了。也许对于早起的armv6处理器来说,ARM指令集还有优势,但是对于新的v7处理器,各种资料都表明Thumb-2要更好一些。
总的来说,ARM指令集会在某些方面有优势,比如手写汇编(额…),而Thumb则能生成更精简的代码,而且还有一点我之前没有太意识到的问题就是:省电!所以仔细斟酌后,我还是决定把NDK编译选项由原来的ARM改回默认的Thumb,遵循默认原则吧还是。
而对于v7和非v7的问题,Android上可以这样处理,以略增大apk为代价,加入单独针对v7和非v7版的so文件,这样apk在安装时会自动根据目标设备的CPU安装合适的so库,从而达到更好的效果,具体做法是在Application.mk中加入”APP_ABI := armeabi armeabi-v7a"
另外,随着项目规模的增大,代码编译生成时间会大大增加,这时候可以考虑更换r8c版NDK新加入的Clang编译器(苹果家的编译器,新版Xcode默认就用它),实测发现Clang比GCC明显快很多,而且对于warning, error的显示也比GCC要人性的多(有人说GCC的提示就像是天书,呵呵),不过据说Clang也有一些不足,比如对于标准的支持不如GCC(这话怎么听着像是说MS的…),不如GCC支持的语言广等,但感觉对于Android原生开发来说都是些无关紧要的事,我只要编译快,运行快就好了!
改用Clang编译器的方法如下:
对于ndk-build方式,可以使用“export NDK_TOOLCHAIN_VERSION=clang3.1”导出环境变量,或者将这个环境变量设置加入到Application.mk中。
对于独立编译方式,在make-standalone-toolchain.sh脚本中加入–llvm-version=3.1 并在makefile中用<tool-path>/bin/clang and <tool-path>/bin/clang++替换 CC 和CXX 参数。
PS:实际编译时发现Clang好像对中文注释支持不是特别好,比如有端代码在if(…)后谢了//中文注释,导致编译器处理至此处时直接报了异常,删除注释后就没事了…
参考文章:
- Producing optimised NDK code for multiple architectures? http://stackoverflow.com/questions/5089783/producing-optimised-ndk-code-for-multiple-architectures
- Is there a way to compile for ARM rather than Thumb in Xcode 4? http://stackoverflow.com/questions/8390606/is-there-a-way-to-compile-for-arm-rather-than-thumb-in-xcode-4
对于Android NDK编译器ARM和Thumb模式的理解的更多相关文章
- ARM处理器的寄存器,ARM与Thumb状态,7中运行模式 【转】
转自:http://blog.chinaunix.net/uid-28458801-id-3494646.html ARM处理器工作模式一共有 7 种 : USR 模式 正常用户模式,程序正常 ...
- ARM处理器的寄存器,ARM与Thumb状态,7中运行模式
** ARM处理器的寄存器,ARM与Thumb状态,7中运行模式 分类: 嵌入式 ARM处理器工作模式一共有 7 种 : USR 模式 正常用户模式,程序正常执行模式 FIQ模式(Fast ...
- android ndk环境搭建,如果是mac,请先装mac make编译器(可以使用Xcode进行安装)
Android SDK:android-sdk-mac_86Android NDK: android-ndk-r4b-darwin-x86EclipseADTCDTANT搭建Android SDK开发 ...
- Android NDK开发之Android.mk文件
Android NDK开发指南---Android.mk文件 博客分类: Android NDK开发指南 Android.mk文件语法详述 介绍: ------------ 这篇文档是用来描述你的 ...
- 关于Android NDK中调用第三方的动态库
因为最近在整合Android 上RTSP播放器的网络库,因需要调用自己编译的网络库,调用一直出现问题,开始时是直接在Android.mk 中加入LOCAL_SHARED_LIBRARIES := li ...
- Android NDK 开发(二) -- 从Hlello World学起【转】
转载请注明出处:http://blog.csdn.net/allen315410/article/details/41805719 上篇文章讲述了Android NDK开发的一些基本概念,以及NDK ...
- Android NDK开发指南---Application.mk文件和android.mk文件
https://android.googlesource.com/platform/development/+/donut-release/ndk/docs/OVERVIEW.TXT https:// ...
- Android NDK 编译选项设置[zhuan]
http://crash.163.com/#news/!newsId=24 在Android NDK开发中,有两个重要的文件:Android.mk和Application.mk,各尽其责,指导编译器如 ...
- Android NDK编程浅入深出之--Android.mk
Android.mk Android.mk是一个向Android NDK构建系统描写叙述NDK项目的GUN Makefile片段.它是每个NDK项目的必备组件. 构建系统希望它出如今jni子文 ...
随机推荐
- UNIX简化路径
Given an absolute path for a file (Unix-style), simplify it. For example, path = “/home/”, => “/h ...
- 学习笔记:AJAX 跨域问题
学习笔记:AJAX 跨域问题 AJAX 跨域是浏览器的问题. 只要 xhr 请求,不同的域名就会出现 AJAX 跨域问题. JSONP 是一要简单方式,但是有很多弊端,需要修改服务端代码. JSONP ...
- 自定义显示提示一段时间自动消失ShowMsgText控件
public partial class ShowMsgText : Label { public string TextMsg { get { return Text; } set { timer1 ...
- 初学FPGA一些建议
数字电路: 这是大学里的基本课程 ,涵盖了一般数字电路的组合电路.时序电路.寄存器传输.储存器以及可编程逻辑电路(FPGA 就是其中一种),还有比较好的添加了计算机的指令集结构.处理器设计等计算机方面 ...
- ubuntu16.04编译QT5.6所依赖的库
首先在QT的根目录下,阅读README文件! 里面介绍了ubuntu环境下,编译该版本的QT需要安装的包 New dependencies in Qt 5 ------------------- ...
- ALSA声卡笔记3--ASoC驱动重要结构体关系图
1.ASoC中重要的数据结构之间的关联方式 (1)Kernel-2.6.35-ASoC中各个结构的静态关系 ASoC把声卡实现为一个Platform Device,然后利用Platform_devic ...
- (文件名.JAVA)的文件名只能与该文件中的public类的名称一致
1.如果类Yuangong 被声明为公共的(public),那么必须将类Yuangong 保存在名为Yuangong.java的文件中:2.反之,在一个文件中最多包含一个顶级的公共类,并且该公共类的名 ...
- 脱壳系列(五) - MEW 壳
先用 PEiD 看一下 MEW 11 1.2 的壳 用 OD 载入程序 按 F8 进行跳转 往下拉 找到这个 retn 指令,并下断点 然后 F9 运行 停在该断点处后再按 F8 右键 -> 分 ...
- ODPS基础
遇到一个项目需求是统计128张分库分表的数据表记录的最大id,通过单表查询计算非常费时,也无法应对分表数更多的情况,因此考虑到通过odps进行任务发布和运算 在云端 http://d2.alibaba ...
- Android复杂自定义Listview实现
在Android中实现Listview对新人来说比较难以理解,本人看了若干文章后觉得可以使用以下思路来让新人更好理解(同时也做好记录,免得自己以后忘记). 可参考博客:http://cinderell ...