Chinaunix首页 | 论坛 | 博客
  • 博客访问: 504146
  • 博文数量: 137
  • 博客积分: 3874
  • 博客等级: 中校
  • 技术积分: 1475
  • 用 户 组: 普通用户
  • 注册时间: 2010-07-05 10:50
文章分类

全部博文(137)

文章存档

2011年(37)

2010年(100)

分类: LINUX

2011-02-19 17:07:10

Android系统的大部分开发都是java开发,然后dalvik虚拟机对java编写的程序进行基于android手机平台的深度优化,使得程序能够比较好的在手机上运行。但是怎么优化,这跟c/c++ 语言还有差距,因此对于在android系统上的一些游戏或者媒体播放器等对计算速度要求比较高的软件,还是用c/c++ 开发的。但是比较可悲的是,Android系统在比较早的版本没有提供c/c++这种native语言开发的资料,只是说可以通过jni调用库文件来操作,作为一个使用linux为内核的系统来说,竟然不能使用c/c 进行开发,让广大linux开发者情何以堪,谷歌的解释的意思是对自己的dalvik虚拟机足够的信任,大部分的开发可以用java开发,在虚拟机上跑,而且虚拟机有比较完善的安全机制,比如定制的IPC等等,可以让开发者更爽,程序跑在各自的沙盒,更加安全。但是java开发者相对c/c 开发者来说,对程序的效率重视程度往往是不够的,常常写一些又臭又烂的程序,不懂的珍惜资源,常常把程序搞的死慢或者FC。你随手写个程序很爽,可是用起来很不爽的。后来谷歌就正式提出了解决方案,那就是NDK,神马是NDK呢,就是native SDK,就是可以让你用c/c++  开发。具体是这样的,你用他给你的NDK交叉编译工具,把你写的c/c++  程序编译成可执行文件或者是共享库文件。什么,为什么不能直接把pc linux下的可执行文件复制到android手机上呢,因为他俩一个是cisc,一个是risc,指令集都不一样。什么?为什么windows下的程序复制到linux下不能跑呢,因为他俩的可执行文件的格式不一样,windows下的是PE格式的,而linux下是ELF格式的,两种格式内部的数据区域,编码区域之类都不一样,根本无法运行。什么?那为什么c/c++就能跨平台?因为他们其实是两个系统把c/c++提供的接口各自实现了,所以c/c++能跨平台了,但是还是需要重新编译一遍。好了好了,别问那么多为什么了,我们继续 :  )   哦哦,跑题了,前面提到NDK允许我们自己编译在Android平台上的可执行文件和共享库文件。这俩都有说头的。我们分别说说这俩。

先说可执行文件,我当时用NDK的版本是r4,话说这个r4版本,还是很弱的,只是支持c语言,对于c++特点的stl以及一些其他库是不支持的,但是我当时移植linux程序到Android的里面用到一些模板,结果就悲剧了,编译报错。后来呢,我发现有高人写了一个优化版的sdkr4,叫做 ,里面的stl是可以用的。但是我发现里面的cout,cin失效了,就是编译通过,但是运行时无操作,弄得我很郁闷,发mail给作者,结果作者不理我,后来过了好久,作者给我回信了,说自己这段期间在医院了(囧,跟我无关),至于我说的问题,他说他也搞不懂,应该是谷歌的问题。不过还好,把cout ,cin用pritf跟scanf替换就好了。最近NDK R5已经发布了,而且已经,就不用通过c/c++搞so然后jni调用来做了,一想 就激动的泪流不止。这样我也就不用介绍怎么通过so和jni调用来开发app了。当然,这是后话了,我还是要介绍一下的,一想之前那段纠结的时光,蛋疼不止。哦哦,跑题了,我们讲Android的可执行文件。最开始,我用的是一种最笨的方法来做可执行文件,也是最简单的,就是做静态链接。
阅读(3290) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~