想做一个带linux 守护进程程的Android应用,但没有C/C++基础,拜托提供一份完整的实例源码呗,谢谢!

转:Android将允许纯C/C++开发应用【附评论。两年前的文章,现在还不支持】-耿然
对于Android,长期以来,我一直有两件事搞不懂,一个是为什么Android要选用Java。对于嵌入式开发,CPU和内存都很宝贵,居然还使用Java。&一个是为什么Android的要被墙。这只是一个技术网站啊。&最近,在一个Android上证实了在NDK r5使用C/C++进行开发。(以前,Android 对C/C++开发的支持仅限于用C/C++开发动态链接库,然后在Java中以JNI的形式来调用)现在,你可以用纯C/C++开发了(参看下面的程序代码)。还有一段(墙,还有XML的manifest,)。看来,Google终于明白为什么使用Android的手机(如:Moto,&三星、索爱和HTC)的触摸体验远远不及object C搞出来的iPhone。void android_main(struct android_app* state)&{&&&&&// Make sure glue isn't stripped.&&&& app_dummy();&&&&&&&// loop waiting for stuff to do.&&&& while (1)&{&&&&&&&&&// Read all pending events.&&&&&&&&&&&&&&&&&&&&&&&& struct android_poll_source*&&&&&&&&&&&// Read events and draw a frame of animation.&&&&&&&& if ((ident&= ALooper_pollAll(0, NULL,&&events,&&&&&&&&&&&&&&&&&(void**)&source))&&= 0)&{&&&&&&&&&&&&&// Process this event.&&&&&&&&&&&& if (source&!= NULL)&{&&&&&&&&&&&&&&&& source-&process(state, source);&&&&&&&&&&&&&}&&&&&&&&&}&&&&&&&&&// draw a frame of animation &&&&&&& bringTheAwesome();&&&&&}&}我个人估计有两个原因为什么Google回头支持C/C++了,Google开始觉得自己整的JVM在性能上可以全面超越传统JVM,并接近C/C++,现在发现搞不定了。&Google发现Java的程序员不像C/C++程序员那样注重程序的性能和效率,开发App太耗CPU和内存。&于是只好转回支持C/C++。本来就是用C/C++写出来的Android嘛,居然不能用C/C++而只能用Java,真是太侮辱C/C++了。最后,只希望Google并不是又整了一个C/C++版的Dalvik虚拟机,不然就真是侮辱到极点了。———&更新
————谢谢大家对这篇文章的评论,挺有意思的,欢迎讨论,我把我的回复更新在下面。不一定对,仅供大家参考。Java的学习成本低,开放性好,兼容性也高,我不否认(但请大家也别否认C/C++的效率要比Java要高。而C/C++的程序员在普遍上要比Java程序员更注意性能和效率)。这应该是Andorid的一开始的定位,可见,Google关注的是程序员,而不是用户。现在转回支持C/C++必然有他的原因,如果不是性能上的原因。那么就请大家分析一下别的原因。Android本来就是用C/C++写的,要跨平台,首先是Android自己跨平台。就像Linux一样,跨平台的首先是Linux,应用开发人员只需要符合Linux的API就OK了。JVM带来的便利只是无需重新编译(就算是无需重新编译,对于开发人员来说也要去那个平台做测试的,因为不同的平台的JVM同样是不一样的)。在Native平台上编译的成本其实并不高,这个编译过程完全可以在部署的时候自动化。有人说,Java的开发成本比C/C++低,但这和语言没有关系,这其实和封装程度有关系。C/C++同样可以封装得很好。而且,C/C++的程序员比JAVA程序来说,天生就对内存和性能要敏感的多。这更有利于在手机这样资源不足的平台上做开发。尤其对于像手机这样的时尚终端来说,在用户体验上花的成本要比在开发人员上花成本要大得多的多。我以为,Google&的Android&更多的关注了程序员,而不是用户。而iPhone更多的关注了用户,也让程序员在开发过程上受到了一些牺牲(iPhone的做法是如果程序员的程序要上App Store,先交99美刀的代码审查费,就像申请美国签证一样),但是,iPhone的程序员虽然在开发的方便上有一些牺牲,但是从收入上却得到了保障。最新的消息是苹果已向开发者支付20亿美元&音乐供应商分成达120亿美元。在《》中对此有充分的论述。最后,请大家思考&几个问题——Android支持C/C++是为什么?如果是为了程序效率,那么这又是为什么?&是开发人员更重要,还是用户更重要?(注意:我说的是“更重要”)&在当今这种诸如iPhone或Andorid的开发模式下,是完全开放好,还是有适当的封闭好?&开发和封闭的背后的商业驱动是什么?如何在开放和封闭中权衡用户、开发者、公司和版权商的利益?&苹果公司给出了一个很不错的商业模式。评论:&好消息啊,&尤其对于我这种喜欢android但是不喜欢Java的&android这种架构是很有见地的,他设计的是一个java操作系统。&&1. java入门快,&容易吸引开发者,&前期策略没有错2.&对于执行效率的说法我认为其次,目前android运行的也很好.&关键是oracle对java的态度不端正,可能导致开源界放弃java, google提前多开一条路而已总之,&作者不了解java社区的情况&,&只好用c/c++的效率优势来说事&我个觉得,Google的Andorid的产品团队正是在了解了Java社区在使用Android的情况之后,才做出了支持C/C++的决定。(对于“效率方面的说事”,这不是我说的,你看看原文,里面还有一张图呢)&quote:最后,只希望Google并不是又整了一个C/C++版的Dalvik虚拟机,不然就真是侮辱到极点了。呵呵,你说对了,开放的c/c++ api也是在davik虚拟机中代码的hook,他这样作仅仅是为了可以帮助移植现有的native游戏等程序,不过已经可以完全用c/c++写程序了(不能用java的那些没有开放的api)&一个是为什么Android的开发站点要被墙。这只是一个技术网站啊。这是我党的一贯宗旨!哈哈&&android的app用java,更重要的是可以在不同的芯片上跑(比如arm, mips)。假如用C/C++了,之前的NDK只支持arm,虽然在大多数用arm的手机上能跑了,但在其它非arm的device上还是跑不了。&楼上正解,用Java就是为了所谓的跨平台部署。Android是开放平台,各个厂家硬件差别很大,C/C++开发的应用只能局限于少数机型才能使用。支持C/C++是为了开发游戏之类的对CPU消耗大的应用。&首先我要说明的一点是不考虑性能的程序员不是好程序员,不管是用什么开发语言。我还是觉得5楼的有理,java 执行效率没有想象那么慢(至少 JVM 虚拟机中的优化已经做的相当出色),最重要的原因还是 oracle 公司对 java 的态度不好。&反过来说,即然如此Java的性能那么好,也自己写JVM,为什么还要回头支持C/C++,一定是有一些难言之隐。我个人试着分析了一下,不一定对,但不妨参考。&JAVA跨平台,C/C++性能利用方面更精细。两者从商业上和技术上有自己的优势,也谈不上什么侮辱谁。谷歌也是商人,也要吃饭,重点是吸引更多的人,占有更多的市场,赚更多的Money。&Android本来就是用C/C++写的,要跨平台,首先是Android自己跨平台。这和是否用JVM没有关系,就像Linux一样,跨平台的是Linux,应用开发人员只需要符合Linux的API就OK了。所以,JVM带来的便利只是无需重新编译。在Native平台上编译的成本其实并不高。尤其对于像手机这样的时尚终端来说,在用户体验上花的成本要比在开发人员上花成本要大得多的多。有人说,Java的开发成本比C/C++低,但这和语言没有关系,这其实和封装程度有关系。C/C++同样可以封装得很好。而且,C/C++的程序员比JAVA程序来说,天生就对内存和性能要敏感的多。这更有利于在手机这样资源不足的平台上做开发。我以为,Google&的Android&更多的关注了程序员,而不是用户。而iPhone更多的关注了用户,也让程序员的利益因此受到了一些牺牲,但是,iPhone的程序员虽然在开发的方便上有一些牺牲,但是从收入上却得到了保障。最新的消息是苹果已向开发者支付20亿美元&音乐供应商分成达120亿美元。&你ping一下就知道为什么被封了,android developer网站是运行在appspot上的,而那个android的二级域名,是绑定在ghs上的。linux的所谓跨平台是指编译跨平台的 android的手机现在已经覆盖了 x86, arm, mips 这三种架构&你难道每个软件都分 xx_x86, xx_arm, xx_mips?他们发布jvm的就是为了确保只有一个软件包而已另外他们用java是可以立刻把许多现存的java手机软件&而现在的手机软件从业人员也可以快速加入开发,因为排除了ip开发&在手机上还是主要java的,尽管我个人也不喜欢java另外还有一点 arm处理器有java硬加速&所以jvm的效率不见的差到哪里去我是支持他用 c/cpp 跑在jvm上的&这样满足了我&可移植和用c的需求谢谢你的回复,这就是我说JVM的真正便利,无需重编译。也不需要在代码里整出些什么#ifdef的东东,不过,完全可以把编译这个过程放在部署中自动化。我完全同意Java的进入门槛低,也知道C/CPP上也有程序,&但这应该不是Andorid转头支持C/CPP的原因。换句话说,我并不认为Andorid是为了讨好C/CPP的程序员才支持C/C++的,这后面必然有性能的原因,而驱动Andorid去考虑性能的原因,并不是程序员,而是最终用户。请思考——Andorid最终目的是为了程序员,还是为了最终为终端手机用户?对于用户,谁管你什么Java, C、C++还是Andorid或是iOS,什么API还是编译什么的,我做为手机用户,我只关心用户体验好不好,上面的应用爽不爽。连Google自己内部的开发人员都不想用Andorid,而用iPhone(中国谷歌员工应该全体人手一台iPhone了)。因为,Andorid的用户体验还是太差,为什么比iPhone差?原因在哪里?硬件的吗?还是OS的?还是App的?我看是后两者的问题。&我觉得目前使用Java开发挺合适的,Java语言有丰富的类库和友好的IDE可用,开发效率较高;另外,跨平台的特性很重要,要不然以后去Market下载应用还要分清ARM和MIPS等各种不同架构的安装包(ARM不同版本可能都不互相兼容),这些对于一般的用户来说有点太复杂了。开放C/C++应该是为了满足用户的需求吧。&1.为了规避oracle的诉讼;2.为了提高运行效率,不是因为java本身,而是因为专利,davik即便提高了效率,但是touch了专利的话部署成本也会很高;3.为了纳入更为广泛的eco system,比如让EA把其他平台C\C++的游戏port过来;&“Google终于明白为什么使用Android的手机(如:Moto,&三星、索爱和HTC)的触摸体验远远不及object C搞出来的iPhone。”这个跟语言没关系,iPhone体验好是因为Apple在人际交互上面已经积累了很多年的功夫,别人一时半会赶不上来,Google技术很牛,工业设计很一般。单纯技术和架构上Andoid我觉得还是领先的(OOP, OSGI),这个和是否用Java或者C/C++是也没有很大关系的。webos用javascript一样很cool。当然对于手机用户来说速度也是很关键的,不过这个跟PC上发展一样,当CPU速度愈来愈快时,语言已经不是很关键了,特别是现在dalvik也使用了jit。但是看到Java暂时慢就退回c/c++而不考虑改进JVM,我想这个应该是技术上的倒退,不是发展的趋势。&如果再不提供C/C++支持……估计会有相当一部分的开发者转向Meego阵营。。。毕竟开发者会更加愿意在更接近自己熟悉的平台上开发。。。至于Android上的Java……性能并没有最开始想象中的那么糟糕……开发Android的公司最初可能仅仅是出于安全和开发难度考虑而使用Java作为基础平台……现在归属Google之后才决定在系统已经较为稳定的情况下进行性能上的优化……&稍微看了一下,NDK对Android API的调用仍然要通过Dalvik,因此用NDK开发普通应用,除了增加复杂度,性能并不会比Java的应用好太多。NDK的优势在于对OpenGL ES等底层接口的直接访问,因此full ndk的支持对游戏/多媒体开发者是有利的,他们不需要太多的android API,只需要一个Activity然后几乎所有的东西都在上面进行自主绘制。这样他们之前用C++写的应用就可以用尽可能小的改动迁移到android上了。而不需要把逻辑层面的东西用Java重新写一遍。对于写普通应用的人,full ndk支持的意义没有那么大。&不是很明白,但是触摸体验这回事似乎和使用啥语言应该没关系:比如愤怒的小鸟,它有iOS版本,有Android版本,两者的体验并无太大区别;要说体验出问题,也不是程序的问题,而是五花八门的硬件导致的问题,比如屏幕的分辨率和CPU的速度。也没有开发人员听到抱怨那种语言更难写,或者某个版本效率更好,似乎这些都是小问题。相反,抱怨最多的却集中在Android平台的硬件兼容问题上,以及付费商店上。要说对用户更友好,谁也无法否认苹果App Store做了双赢:开发者赚了钱,消费者图了方便;而这个结果,其实和开发语言毫无关系。&愤怒的小鸟并不能代表所有的Java程序员,以及所有的andorid应用。不过,我很同意你所说的,要兼容于很多不同硬件所产生的代价。我也很同意,这并不是语言的问题,我一直坚持这个观点,如果不是语言的问题,为什么要去支持C/C++?原文说这样可以利用到最好的硬件性能,那么为什么要利用最高的性能?是不是说Java的开发有了一些限制?限制了什么?程序员的开发体验还是用户体验?&乔布斯说的这段话,才是Android和iOS之间的真正的区别(注意乔布斯一点没提开发语言,因为那根本无关紧要):“谷歌喜欢强调Android是“开放的”,而iOS和iPhone是“封闭的”。我们发现这有点不够真诚,而且模糊了我们之间真正的差异。我们多数人&听到“开放”这个词时首先想到的是Windows,这款系统被用于多种设备,而且多数PC都拥有相同的用户界面,并运行相同的应用。但是与 Windows不同,Android非常分化。许多Android OEM厂商,包括宏达电和摩托罗拉这两家最大的企业都安装了专有的用户界面,以便将自己与大众化的Android体验区分开来。而要搞清楚如何使用,都要&由用户自行处理。相比而言,所有的iPhone手机运行方式都一样。  Twitter客户端(TweetDeck)最近发布了他们的Android应用。他们表示,需要应对244款不同型号的手机采用的100多个不同版&本的Android。不同的硬件和软件版本会给开发者带来巨大的挑战。许多Android应用只能被用于特定的Android手机、特定的 Android版本。而且这种手机从正式出货至今还不到12个月!与之相比,iPhone只有两个版本的软件需要测试:现在正在使用的版本,和最近的上一&个版本。  除了谷歌的应用市场,亚马逊、Verizon和沃达丰也都宣布将推出自己的Android应用商店。所以至少会有4个Android应用商店,要找到&喜欢的应用,用户要对这四个商店进行搜索,而开发者也需要通过这四个商店分发应用并获取收入。无论是对用户还是开发者而言,都会十分混乱。  相比而言,苹果则拥有一个统一的应用商店,并为用户提供最简单的使用方式以及全世界最大的应用商店,而且该应用商店已经被预装到每部 iPhone上。苹果应用商店的规模是谷歌Android Market的三倍多,而且为开发者提供了一站式服务,使之更容易进行推广,并快速得到报酬。”&我支持google继续jvm方向为主,也希望提供更多的C/C++API.本人是一名C++工作者.硬件上细节太多,arm就有好几版指令集,armv5te,v6,armv7-n的新指令集.这样就很难做出性能和兼容兼顾的东西.google做的平台抽象掉这些实现细节.让软件稳定的运行在绝大多数CPU上.事实上绝大多数的计算都是在系统本身的C/C++代码上跑的.包括图形声音,通信连接等等,都是系统的C++共享库搞定.只有很少量的代码是第三方应用的java字节码.当然除非你喜欢在手机应用上用很多的for while 迭代递归.或者喜欢java编写复杂的数据结构.所以希望google继续优化jvm.提高效率.做好jit.未来是属于很多不同类的异构CPU.只要有X86 armv5 armv7等不同版本的 android就行.不要出现一大堆不同版本的android应用&Aandroid一开始仅支持Java居然而不支持用C/C++开发应用软件,C/C++支持者们感动了侮辱;后来听到消息即将添加对C/C++的支持了,C/C++们急急的跳起来欢呼了,顺便再把Java踩上一脚,似乎压抑了很久。楼主的博文给我的就是以上印象。(如果我理解有误,或我的说法过分,请予谅解。)其实大可不必。本来很平常一个事:Android想多条腿走路,想给自己和开发者一个新的选择;仅仅是扩充,不是取代不是否定。比如我平时吃惯了馒头米饭周末想去吃顿牛排。博主在C/C++领域是知名人物,但对Java/Android领域有诸多不了解和误解。我先简单说说Android系统:广义的Android系统&= Linux核心&+ Devik(Java虚拟机)&+ Harmony(Java标准库)&+&各种库(java库/非java库)&+&各种服务(java的/非java的)&+&各种应用程序。广义的Android系统中去除Linux核心剩下的部分,可以称之为狭义的Andorid。Android是一个以Linux核心为基础的全新的操作系统,很显然Android是以Java为核心构建的(Java的运行时、库、框架、应用程序),而C/C++在构建Android过程中发挥了主力作用(各种底层实现,狭义Android与Linux核心的胶合)。可见在Android中Java和C/C++是和谐相处的,都是顶梁柱,都不可或缺,区别只是Java在前台而C/C++在后台。总之,Android是综合运用各种技术和各种现有资源充分发挥其各自优势开发的优秀的开放性平台。(本段为liigo原创。)以iphone作为对比说Android手机触摸体验不好,没有说服力,因为没有考虑到iphone的封闭平台、单一硬件体系、单任务、更高的设备售价等因素。iphone界面快速反应的背后其实也有取巧的成分。Android系统也在快速改进发展中。&Android 一直都支持本地代码的,最早NDK&还没发布的时候就有人用支持ARM芯片的编译器编译出C/C++写的android程序,还有教程:见 pro android gamesAndroid 绝对还会继续以JVM为主的,如果只考虑速度的为什么不直接用ARM汇编直接写汇编代码?那不是更好,目前看来Android大部分游戏在中档机里面已经能够运行得非常流畅了。再说可以用proguard&来优化混淆某些特定的类或函数。JNI的调用在android里面本来也不快,不必钻牛角尖的要用太底层的东西来优化,除非有必要,有必要的情况其实根本就不多。开发游戏来说,如果画面里面的sprite比较少或者更新更新的很少,Canvas就比OpenGL ES用起来方便,还一样快。&可能也有规避与Oracle关于java官司的准备。但是我觉得这样的可能性很小。Google也不会提倡使用C/C++来开发App,因为兼容性会很差,Google可不想重蹈Symbian的后尘,我只愿意相信,那真的只是想提供给喜欢折腾的人和吸引更多的程序员来关注这个平台。&:如果Android的Java一切都好,既然C/C++的跨平台那么差,学习成本那么大,为什么还要反而支持C/C++?……这世界上任何事情都是相对的,谁也没说Java绝对好C/C++绝对一文不值,就算Java足够好为什么就不能绵上添花呢?:另外,关于哪个是后台,那个是前台,我觉得在手机上还分前后台,这个有点搞复杂了,求官方解释。在Android开者的原文中提到了游戏开发中的性能,并没有提到前后台。我个人关于Android系统中“Java前台C/C++后台”角色分工的提法,在我前面的回复里已经表达的很清晰了。就好比电视节目主持人和制作人的角色分工,知名主持人主持的知名电视节目,其内容和风格肯定是围绕主持人设计的,而为了完成这个节目制作人肯定也在背后做了大量工作。这是很通俗的说法,是我个人的说法,应该没有官方解释。:关于iPhone的解摸体验,如果你有朋友在谷歌工作,你可以向他们咨询一下是什么情况。一个更有说服力的例子是,谷歌的工程师们现在是人手一台iPhone4,而不是Android。如果只用自己的产品,而排斥市场上的其他产品,那跟闭门造车有何区别?多接触其他产品,尤其是竞争对手的产品,多去发现别人的优点和自己的欠缺,才能更快的进步。这应该是市场共识了。谷歌在这方面恰恰做的很好。而且你这个例子也不能说明谷歌员工不重视使用自己的产品。&:关于iPhone的封闭,我博文说了,想请从用户的角底上思考一下,而不是从程序员的角度。从用户的角度上思考,确实,他们不管什么系统什么硬件什么软件,只要能完成工作并且体验很好就OK。但iPhone只有一个型号,而用户的需求是千变万化的,比如有人喜欢物理键盘,有人喜欢4英寸以上大屏幕,有人想在手机上浏览Flash网页,有人想要真正的多任务在后台完成更多的工作,等等……单一型号产品固然有其优势,但它注定不是全部。关于iPhone的讨论,我就此打住,不再多言。人各有志,无需强求。&&&不用想得那么复杂,android支持C\C++开发,只是为了游戏开发能压榨出硬件的极限性能,达到IPHONE的游戏水平,毕竟游戏是最大的应用&个人觉得,ORACLE对java的态度是主要原因,当然我想Google也同时考虑到了效率已经开放的问题。Android作为一个基于不同处理器的平台,处理兼容性确实是一个不小的问题。&虽然说产品最终决定于用户,但,产品总是需要程序员来开发的,考虑考虑程序员的态度也是没有错。另外说到开放的问题,现在有很多c/cpp的程序员,其中有很多是资深的精英程序员,因为各种各样的原因,他们不使用java。Android不提供c/cpp的sdk,其实也是很可惜的将这些精锐排除在外。&&:android的app用java,更重要的是可以在不同的芯片上跑(比如arm, mips)。假如用C/C++了,之前的NDK只支持arm,虽然在大多数用arm的手机上能跑了,但在其它非arm的device上还是跑不了。&你不是在开玩笑吧?NDK只支持ARM,你的APP在MIPS上怎么跑?再说了只要不使用汇编,C/C++的可移植性也很强,只需要用相应的交叉编译工具重新编一份就完了。别拿java的跨平台性当宝,多得是不能跨平台跑的java程序提到用户体验,&就很明显了,&使用 objc 的 iphone3GS (600MHz)&比使用 java 的 HTC Hero (android 2.2.1 + 600MHz OC to 691MHz)&还要流畅,&单单在 home 的流畅度并没有太大差别,&但是在这之下的 hero 运行 apps 速度都明显低 objc 一个档次,&为啥? hero cpu (OC)&还比 3gs 高一点,&为啥还是不流畅?再说一个跨平台&(java&程序员最爱的特性), android 跨平台想跨去哪? win 下跑 handcent?&跑 twitter for android?&扯淡吧…android 只要特工一套 api,&只要厂商保留这些 api, c 一样可以跨 android, android 的 apps,&就留在 android 吧“原文说这样可以利用到最好的硬件性能,那么为什么要利用最高的性能?”只说一点就够了,&游戏,&试问现在哪个大作是 java 写的?&大部分用户买手机的期望是什么?&通信&+&娱乐&(上网,&游戏,&听歌,&看电影),&如果舍弃了娱乐功能,&买 android 作甚?&一部 nokia 几百块钱黑白屏的可以长时间待机这帖应该归底不是讨论java和cpp的.应该是抽象字节码PK本地机器码.我认为抽象字节码代表未来.就像微软的.苹果的llvm.还有android的jvm-jit技术.语法和编译技术的改进终究会抵消性能上的差距.并带来更多的逻辑优化和异构执行能力.&诶?难道gcc等众编译器不是各种平台都有?要说源码级跨平台,有谁比得上gcc?我看google早就想支持c/c++了,因为g公司是著名的喜欢用c++的公司。只不过是精力和规划问题,只能先支持战略意义更重要的Java了。如今来说一个平台如果只支持一种语言一种范式开发,本来就是不好的。iOS再不努力,只支持objc/c/c++,恐怕也要吃亏&&假如說操作系統只可以用C開發,突然能用彙編開發,你會有什麼感覺么?不會有什麼感覺。因為你根本就不會去用彙編作為工作語言。那麼一個原本只允許Java的平台,現在允許C/C++了,作為Java程序員,你會有什麼感覺么?沒有。不過哪些力挺C/C++的程序員“得意”了:“看,現在支持C/C++了~“。語言上的爭論沒什麼意義,對用戶來說不是什麼重點,你會關心你的機頂盒裡面用的是什麼語言么?話說回來,假如你關心的是語言所關聯的平台特性的話,那麼就更加沒有什麼懸念了,開放平台缺乏吸引大量普通用戶的能力的話,嘗試下封閉平台的一些特徵有什麼問題呢?對於程序員來說只是增加了一種選擇,或者把更多的程序員拉攏進來,沒必要那麼酸溜溜的。&跨平台在不断变化的手机硬件上是非常重要的。iphone硬件单一,PC上完全是x86(64)架构,因此才可以native code打天下。但google显然不想局限在arm上。至于你说的部署时自动编译,基本是不靠谱的,理由是:1、软件安全。世界上并非所有开发者都想开源。2、java虚拟机现在基本是用JIT实现,可以达到接近编译native代码的程度。至于为什么要支持C/C++。。请问C语言中为什么要支持内嵌汇编?我个人估计有两个原因:1、C语言设计者开始觉得自己整的语言在性能上可以全面超越传统汇编,并接近机器语言,后来发现搞不定了。2、C语言设计者发现C的程序员不像汇编程序员那样注重程序的性能和效率,开发App太耗CPU和内存。这也是为什么很多游戏引擎中仍然大量使用汇编优化。另外,手机的未来趋势是什么?性能越来越强,存储越来越大。symbian设计的时候考虑了很多效率方面的问题,结果如何?未来的手机开发必然是越来越接近电脑,而远离嵌入式开发。Android和iPhone根本就不是一个思维下的产物,讨论这个问题就和讨论Linux和Windows哪个好一样,不会有结果,只会有争论。在微软、百度,大家都用google搜索。但是不能因此全盘否定bing和百度吧?&&我是做游戏开发(游戏机和手机平台)的android手机使用者。以我的经验来看,同等级配置下android手机运行游戏普遍不如iOS平台流畅。WP7也类似。VM的存在,对于程序运行效率还是很明显的。数据上看,现代JIT技术也许能把中间代码的执行效率,提高到和一个正确编写的C/C++程序在同一个数量级,也就是不慢10倍以上。但对游戏来说这还是远远不够。就android平台而言,除游戏外的所有应用(也许还得排除多媒体类),可以说大致上不弱于iOS。某些特定领域甚至更强。但谈到游戏体验,只能说是个杯具。如果google能支持用c/c++写原生应用的话,也许会有所改变。&我以前做过反汇编,也做过PC游戏,现在做手机游戏。以我的经验,游戏里面用汇编优化,主要是利用多媒体指令进行优化而已,因为这部分C/C++没办法做到这点,当然可以开启编译器指令中对SSE指令优化,但是一般没那么做。SSE有多个版本,兼容不同的CPU,SSE主要也是能64处理数据。不管C++还是Java,对Google这种平台开发商而言,他做的就是想让更多的开发者参与,从而有更多的手机产品用以手机用户。还有游戏并非大量使用汇编优化,至少PC引擎是那样的。PC优化最先考虑的是渲染,这个跟D3D有关,汇编几乎用不到。看到那么多人回帖,每次讨论的都是那个恒古不变的话题,语言优劣之争。&有什么意思。走自己的路让别人去说吧。&大家的产品见分晓。而不是争那么多没用的理论。&虽然是老帖,还是冒个泡。android的目的不是为了赚钱,不是为了用户体验,而是为了圈地。也就是说,先占领用户以及程序员以及设备产商的市场,然后再改进。这是典型的圈地运动。圈地运动最重要的是速度,要想最快速度的推广,就必须借用目前世界上最丰富的程序员资源,而什么程序员最多最便宜?毫无疑问是 Java。我与某外包公司老总聊起过这个问题,他说现在4-6k就可以找个不错的 Java 程序员,但是同等水平的 C/C++&至少要多 50%-100%&的工资。为什么 java 程序员便宜,不是因为他们不卖力,而是因为他们太多了,供大于求,所以便宜。因此来看,Java&的最大好处是:最丰富的程序员。反过来说,为什么要支持 C/C++?这个道理似乎 google 官方都已经明确的给出了答案:性能问题。官方甚至说了,不推荐仅仅为了移植程序而使用NDK,仅仅建议把性能要求高的地方使用NDK编写。说性能问题不重要就很无语了,Java性能加了JIT就算能达到一个数量级(10倍以内),但一个数量级很多时候也是无法接受的。正如 2 和 8 也是一个数量级,但他们能达到的水平完全不一样。简单的说:如果你可以接受 30fps 的视频/游戏,是否意味着你一定能接受 7.5fps 的视频/游戏?4倍的性能差异是否肯定可以忽略不计?600M&的 CPU 跟 2.4G CPU 的性能差异是否可以忽略不计?性能问题就是推出NDK的原因。道理一直都是这么简单。&第二个问题不是废话吗?当然是用户更重要了!!!程序的执行结果最终还不是交给用户!!!估计google就是基于这个理由才让android支持纯C/C++的,毕竟更流畅总比很流畅的要好。还有一点,首先,我要感谢java,它让我迅速进入编程世界,领悟软件设计,软件工程,但是学了编译原理和汇编以后,java的内部实现机制开始让我有点想吐,结合软件工程,编译原理,汇编和几个java项目经验,我终于总结出了两个个肤浅的观点:一:java程序消耗一大堆内存和cpu时钟频率去讨好程序员,而不是用户。二:我不想否认其他程序语言,但是我觉得,桌面应用程序的开发语言有c/c++就够了(当然应用程序里面的脚本语言javascript,actionscript之类的东西不能算进来)。Object C 和 C++&居然都能互相喷起来……&我都用过,感觉确实各有长处。我是接触C与C++入门的, Java是后来才学的,但基本不喜欢用。在手机这种平台上开发本来就应该更加注重效率与合理的资源利用,我仍然坚持认为应该推出C\C++的API。&我认为, Android选择Java恰恰是为了用户体验,&为了使用户在安装应用时更方便.&对于IT从业人员来讲,&自己用的是什么牌子的手机,&什么型号会了解的很清楚,&但大部分消费者并不了解自己的手机型号,&试想一下当他们在网上下载应用的时候,&面对着几十个品牌,&几百种机型的安装包,&他们要如何选择?&这必将给用户带来很大的挫败感.语言本身都是跨平台的,&不跨品台的是平台相关的API, Java的优势是Compile once, run anywhere,&也就是只有一个安装包,&我觉得这才是Android选择Java作为应用开发主要语言的初衷.&现在支持C,&只是为运算密集型的应用提供一个提高效率方法,&但C/C++绝对不会取代Java成为Android应用的主要开发语言,&因为绝大部分应用和游戏都不是运算密集型的(大部分非3D游戏都不需要C/C++优化, 3D/2D并不是衡量游戏好坏的标准,&娱乐性才是,&而且目前2D游戏远多于3D游戏).另外,&博主所说的使用统一的API,&用C/C++开发,&然后在安装部署的时候再编译成Native Code确实是一个不错的想法,&可是您有考虑过有多少公司和开发者愿意将自己的源代码做成安装包发布呢?&个人认为,google当初选择java的原因,一是因为java程序员数量庞大,这样在android初期能快速增长app的数量,以app数量抗衡itune store,第二个原因,ios软硬件完全一致,而生产android设备的,无论厂商和硬件平台都有很大差异,这种情况下,java的适应性要好于C/C++,如果用C/C++,开发者也不得不为自己的app发布多个平台的版本就,在这样的多硬件版本下,C/Cpp就成为了一种笨拙的方式,很象当年的symbian,至于为什么要发布NDK r5支持C/C++,原因可能就很多了,效率性能,用户体验,oracle专利之争,等等都有可能&&笑死我了,C/C++和JAVA哪个好这个问题都争论多久了,还在争论。很多年前我是觉得C/C++比JAVA好。后来我发现语言不是问题,用户一点都不关心。用户只关心自己需要用到的东西好不好用。只要用户用到的东西没有让他不爽,他才不关心你是JAVA还是C/C++,甚至你拿一堆垃圾搞出来一个东西他用得爽就行。总之,所有编程语言对用户来说都是一样的。&性能上的问题是一方面,更多的可能是java专利问题,andy当年可能是看中了强大的开源harmony,而且手机J2SE的程序员很多,回头来说不支持C/C++应用开发的OS 还有啥意思呢,无所谓语言啦,还是多看看有些什么好的应用吧,谷歌不要再成为一个SB微软就行,把语言,框架当产品做,一天一个样,我勒个去,真是蹂躏程序员啊!这点做过win app 或者.net&的人都深有体会,MS快点死去吧,看APPLE,从来就不关心语言啥的,框架啥的,Object C 用到极致也就有了现在的i&系列!关键是打算从谁身上赚钱,针对个人用户就应该最大可能的简化操作难度;针对公司、机构神马的就不必了,不然吃谁去?也就是apple向和ibm向的区别吧&连Google自己内部的开发人员都不想用Andorid,而用iPhone(中国谷歌员工应该全体人手一台iPhone了)。因为,Andorid的用户体验还是太差,为什么比iPhone差?原因在哪里?硬件的吗?还是OS的?还是App的?我看是后两者的问题。&&作为一个移动平台,其本身固然重要,但更为重要的是Apps。Google会选择Java作为Android应用开发的语言,是因为Java开发人员在所有开发人员中所占的比重,那么从这个角度来说,势必会使Android的应用快速增长,其二可能是Java易于上手。所以单从快速占领市场份额来看,这是很好的选择。个人浅见,请多包涵。据说.net的程序员比Java的更多,更廉价嗯,技术人员容易搞这个。不过,我的确不想讨论语言。我想讨论的是对于手机这么一个特殊的终端,重要的不是语言和操作系统,而是用户体验。而目前的Android+Java因为过多地考虑了程序员的开发体验,返回忽略了用户操作体验。&开始用java也是为了用户,一个啥功能没有的系统谁会用?用他做什么?不可否认,JAVA程序员要比C/C++程序多,开发要比C/C++容易一些,这样,可以让这个平台迅速产出很多软件供用户使用.现在用户多了,程序也多了,用户的要求提高了,要速度了,所以支持C/C++了java 性能是不如c,哥是搞java的没有你那么高端,c++程序员是比java程序员注重效率,但是,java程序员,比c++程序员更注重模式,更注重代码怎么重用。想要快速开发还是的java,想要以后维护更容易还是的java,虽然牺牲了性能,硬件发展很快,过几年那点级不足为虑了。&iphone搞的是软硬件一体化,是封闭的系统,用objectC生成native code也算是一个很自然的选择。android/windows phone只搞软件,硬件是要兼容各厂商的,为方便app的部署,引入一个跨平台的运行环境也就是很自然的事情了(java/.net).&但是,android/windows phone这种开放的系统,还是想兼顾程序员、用户、各硬件厂商,that is ‘reuse of existing code’ and ‘some cases increased speed’,&所以又引入了c/c++,也算是很正常的行为了。这是一个多元化的世界,开放系统与封闭系统都能活下去,但目前看来是封闭系统占了上风,后事如何,且拭目以待,哈哈&其实你们只是从部分技术和部分市场来看待问题,很肤浅!我对于手机硬件、软件、底层、上层我都很精通,但如果我开发iphone应用,我只能做一个程序员,如果我用安卓平台我可以从TI买个开发板,自己基于安卓可以开发出很多种类产品,不仅仅是手机,而且是软硬结合的产品,iphone只能在软件很小的方面能和安卓比,其余的都没办法和安卓比。&希望C++能在移动终端领域有更好的发展,JAVA,C#,C++都用过,但心中的挚爱仍是C++,楼上有个哥们说JAVA程序更多的使用模式,注重重用等,C++难道就不是这样吗,C++让你更自由,写代码如同在创作一件艺术作品,正确,高效,优雅。其实归根到底,语言无优劣,只有使用它的人在更合适它的领域充分发挥它的优势这才是关键。&使用Java主要是对硬件抽象的考量吧!Android设备碎片化太严重,更可怕的是CPU结构的区别,Android除了使用ARM的也有使用X86和MIPS的。这个Java对这一块比C++擅长。&支持JAVA是聪明的选择原因:java门槛低,程序员数量基数很大,可以迅速展开应用市场。至少很多java程序员自身就会购买Android智能设备。支持C/C++是智慧的选择原因很简单:1。要想应用做的好,java不行。2。前期迅速展开市场后,开始支援C/C++&开发出更节约硬件资源的应用才能把Android推向高潮。分析:为啥开始不直接支援C/C++而选择java 请看看Windows Phone,至少Google比Microsoft获得了更多的市场份额。rinidaye &Java确实不适合做高负载性能敏感的技术开发。真的不如用C/C++来做。不过Java简单,入门容易,煞笔程序员好找&这就好比为什么CGI的性能最高,还有那么多web开发语言出现,而不用性能最高的c/c++写CGI。类似java来处理复杂的业务逻辑到目前位置还是最合适的。android的出现时机非常好,正好赶上芯片性能整体提升(CPU/GPU, RAM, ROM),3G的配合发展,没有3G网络,智能机也无非就是个街机。android选择java我认为是很明智的,因为开发人员的技术庞大,让支持的app市场迅速爆发,有了app的支撑,吸引了越来越多的开发人员。有了越来越多好用的app,才有了越来越多的智能机用户,这才能进入良性循环。window 8的应用市场就看到了,吸引不了开发人员,产品就会无人问津。就目前来看cpu等硬件性能,已经不是dalvik的瓶颈了,iphone 5和主流4核android手机没有太大差距了,iphone 的优势也再消退,但android多终端的劣势也很明显,给开发人员造成了很多困难,不如ios那么容易。&1、作为市场的后入者,需要在短期内拥有大量的开发者和应用程序,自然Java优先于c;2、从google的自动驾驶汽车和glass看,作为整体(长远)规划,他希望程序能更多的和硬件交互,那么就需要支持c/c++。暂时想到这两点。&理论上来说,使用dalvik java开发普通软件并不会有性能损失,当然只是理论上,一般来说,类似杀毒软件,游戏,地图之类的应用dalvik就不行了,总的来说很少有java不用jni的……,你用java给我写个稍微大点的算法试试……其实我一直有个疑问&,java的优势其实并不在其jvm的跨平台,而是在其语言本身,要是java是个编译语言,它将赢得更大的优势,而c++根本不适合开发大型软件,那为什么没有人开发一个native的,适合大型系统和上层软件编写的语言呢,难道native语言永远要那么复杂吗(准确的说应该是繁杂)&java的跨平台其实就是唬唬初学者的,平台本身的差异还是有的,比如linux的路径是/***/***的,windows 的是*:\***的,这会导致各种各样的问题,我就碰到过,还是要分类处理,其实java的语言特性更少,并且其标准库已经做出表率,所有的类,函数,变量的名字都是具有意义的,不像c++&,全部都是下划线……然后一堆莫名其妙的字母,类型也是奇奇怪怪的,其实c++从没有考虑合作开发,c++的typedef&方便了个人,拖累的团队,诸如此类的还有没有类似javadoc的东西,没有统一的插件,框架,库的标准c++的一个库QT,试图弥补这些缺点,qt写的软件,源代码拿起来可以直接读,开发效率绝不比java差,但是这仅仅是表面上的弥补,要解决根本问题,只有开发一门新的native语言,代替c++,它将具有跨平台的强大的标准库,统一的标准,规范的命名,加强的团队特性等,这样才能挽救上层软件中的native语言(native语言本身不会有事,总是要有一个语言来编写native代码的,不然你jvm怎么写)&
推荐了此文字

我要回帖

更多关于 拜托了冰箱魏晨完整版 的文章

 

随机推荐