对于Android NDK编译器ARM和Thumb模式的理解

作者:无名 - java -

编译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


 

IT人知识库 该篇知识地址:http://www.itpeo.net/12806/3488905.html





rfedfre

ZOJ 1146模拟题

题意是求七段数码管的显示,可将显示分为五个部分,垂直方向三个,水平方向两个; 最后再求五个部分的组合。。。。好麻烦呐,... ...

rfedfre

大型网站系统架构分析相关

千万级的注册用户,千万级的帖子,nTB级的附件,还有巨大的日访问量,大型网站采用什么系统架构保证性能和稳定性? ... ...

rfedfre

设置 gvim 启动时候的默认设置

  方法一:       打开GIM-->编辑--... ...

rfedfre

JAVA 中 replace 和 replaceAll 的区别

replace和replaceAll是JAVA中常用的替换字符的方法,它们的区别是: 1)replace的参数... ...

rfedfre

英文女名的寓意

英文: 中文: 来源: 涵义:     Abi... ...

rfedfre

将Eclipse的console插件加入到自己的RCP应用程序中

打开plugins.xml, 在Dependencies项中,点击add,加入org.eclipse.ui.c... ...

关于printk显示问题

  printk()函数的总结 我们在使用printk()函数中使用日志级别为的是使编程人员在编程过程中自... ...

趣味横生签名秀

100条超搞笑的“雷人”QQ/MSN 签名 001 - 老鼠一发威,大家都是病猫。002 - 和一MM争论鲸鱼是不是鱼... ...

做技术有的混吗?

转贴!!! 我现在是自己做,但我此前有多年在从事 软件 开发工作,当回过头来想一想自己,觉得特别想对那些初学J... ...

sicily1122. Prerequisites?

1122. Prerequisites Constraints Time Limit: 1 secs, M... ...

[转]NDK编译库运行时报dlopen failed: cannot locate symbol "__exidx_end" 解决办法

原文链接:http://blog.csdn.net/acm2008/article/details/41040015 ... ...

rfedfre

自定义分词器Analyzer

参考:http://grunt1223.iteye.com/blog/969197   Anal... ...

Oracle 体系结构及安全管理

1  oracle数据库服务器构成:数据库和实例   2 oracle内部结构:   ... ...

(A10)Tapestry Core:Localization

本文翻译出处 http://tapestry.apache.org/tapestry5/tapestry-cor... ...

rfedfre

Web技术电子期刊2008年第9期(总第26期)

我们用心服务,与您共同进步。 第26期出来了!感谢大家一直对本刊的支持! 如果下了不看,请您不要下,谢谢。 ... ...

rfedfre

magento 添加上传功能 Adding upload field in contact form and send as attachment

Introduction Nowadays most of the clients wants extra field... ...

程序员新人怎样在复杂代码中找 bug?

1. 优先解决那些可重现的,可重现的bug特别好找,反复调试测试就好了,先把好解决的干掉,这样最节约时间。2. 对... ...

微信沟通接口上线,开启移动应用与公众号的连接

  微信沟通接口正式上线,用户可以在移动应用中,点击跳转到微信客户端... ...

rfedfre

动态软件框架开发模型图

动态软件框架开发模型图 动态软件模型结构图服务器端设计概念使用后台服务模式运行,客户端使用本地加载模块{插... ...

rfedfre

DDD:策略模式怎么结合动态表达式

DDD:策略模式如何结合动态表达式   企业应用中我们经常会遇到各种业务规则,针对这种规则,我们多数情况会采用策... ...