Android将允许纯C/C++开发应用

Android将允许纯C/C++开发应用

对于Android,长期以来,我一直有两件事搞不懂,

  • 一个是为什么Android要选用Java。对于嵌入式开发,CPU和内存都很宝贵,居然还使用Java。
  • 一个是为什么Android的开发站点要被墙。这只是一个技术网站啊。

最近,在一个Android开发人员的Blog上证实了在NDK r5使用C/C++进行开发。(以前,Android 对C/C++开发的支持仅限于用C/C++开发动态链接库,然后在Java中以JNI的形式来调用)现在,你可以用纯C/C++开发了(参看下面的程序代码)。还有一段完整的代码示例在这里(墙,还有XML的manifest,又见XML)。看来,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.
        int ident;
        int events;
        struct android_poll_source* 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++了,

  1. Google开始觉得自己整的JVM在性能上可以全面超越传统JVM,并接近C/C++,现在发现搞不定了。
  2. Google发现Java的程序员不像C/C++程序员那样注重程序的性能和效率,开发App太耗CPU和内存。

于是只好转回支持C/C++。本来就是用C/C++写出来的Android嘛,居然不能用C/C++而只能用Java,真是太侮辱C/C++了。最后,只希望Google并不是又整了一个C/C++版的Dalvik虚拟机,不然就真是侮辱到极点了。

——— 更新 2011/01/24 ————

谢谢大家对这篇文章的评论,挺有意思的,欢迎讨论,我把我的回复更新在下面。不一定对,仅供大家参考。

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的开发模式下,是完全开放好,还是有适当的封闭好?
  • 开发和封闭的背后的商业驱动是什么?如何在开放和封闭中权衡用户、开发者、公司和版权商的利益?

苹果公司给出了一个很不错的商业模式。

(完)


关注CoolShell微信公众账号和微信小程序

(转载本站文章请注明作者和出处 酷 壳 – CoolShell ,请勿用于任何商业用途)

——=== 访问 酷壳404页面 寻找遗失儿童。 ===——
好烂啊有点差凑合看看还不错很精彩 (37 人打了分,平均分: 4.49 )
Loading...

Android将允许纯C/C++开发应用》的相关评论

  1. 还好吧,对于很多应用来讲并不需要非得用C/C++的效率,要不然JavaScript的效率怎么办?
    但有一些功能利用C/C++的效率会有更好的效果的,比如浮点计算等,所以Android要提供更好的C/C++代码的支持。

    不太认为Android会用C/C++模式全面替代Java,毕竟对于Android来讲,Activity是主,binder是基础。

  2. 大家的回复都很精彩,让我也能学到很多,尤其是28楼@chenyi1976 的回复,Jobs的眼光的确比Android独到多了。

    Android社区本来就很乱了,今天再加上C/C++,只会更乱,这注定Android只能成为小吃性质的餐馆。

  3. 跨平台在不断变化的手机硬件上是非常重要的。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和百度吧?

  4. 支持c++开发有毛用啊,只要有java,大家还是会挑简单的用的。

    google应该自己先把android重写一遍,才能根本解决问题。
    或者就干等把,等到cpu强大到秒杀java性能的时候

  5. 不辣的老姜 :
    C++是一种脑残语言。支持C++还不如支持Objective C。

    得了,objc才脑残,乔布斯的偏执拍脑袋决定的东西.
    我的电脑上没有一丝一毫的objc编写的东西.你敢说你的平台上没有cpp编译的东西吗?

  6. apple有能力以一己之力把objc捧起来,但是google并没有这样的号召力(至少在我看来)。以其迎合用户,不如在前期以迎合程序员的角度,降低开发软件的难度,来抢占一些软件开发人员,增加软件的数量。这就是我的观点。

  7. 就象是微软发展了.NET,回过头来又发展SilverLight一样,模型与它的精密实现体是有差异的。 Java这时是个建模语言,而C++才是它合适的work语言,水平就在你能不能让它们两个走一个模式,兼容起来。

  8. 你们又开始讨论哪个语言好哪个语言差了 脑残不
    明显是oracle告google侵犯java版权,google留个后手 这都看不懂

  9. 我是做游戏开发(游戏机和手机平台)的android手机使用者。以我的经验来看,同等级配置下android手机运行游戏普遍不如iOS平台流畅。WP7也类似。VM的存在,对于程序运行效率还是很明显的。数据上看,现代JIT技术也许能把中间代码的执行效率,提高到和一个正确编写的C/C++程序在同一个数量级,也就是不慢10倍以上。但对游戏来说这还是远远不够。

    就android平台而言,除游戏外的所有应用(也许还得排除多媒体类),可以说大致上不弱于iOS。某些特定领域甚至更强。但谈到游戏体验,只能说是个杯具。如果google能支持用c/c++写原生应用的话,也许会有所改变。

  10. 回复博主:为什么http://developer.android.com/ 会被墙:因为天朝某个通讯集团公司的阴暗心理造成的,他们一心想用android的源码造一个山寨系统,然后山寨一个app store,所以墙了

  11. 我不懂Java啊, 下了NDK看了一下例子, 似乎写程序必须以Java为框架, 只是JNI部分是C++来写.
    可能这样的话, JNI只是用来写APP中”需要密集计算”的部分代码, 执行框架还是Java的呀.

  12. Google想拥有一个属于自己的游戏开发平台,就如同PSP一样。
    因为他看到了索爱的PSP手机,眼红了。

  13. @luckcape
    游戏和视频这类应用必然硬件与时具进,谈什么跨平台,不移植,笑话。否则就游戏追求的不是表现力或者视频的档次太低。

  14. 我在偶然间发现了一个Android开发站点,跟原站点完全相同,但没有被墙,有需要的可以看一下。http://androidappdocs.appspot.com/index.html

  15. 用java的是菜鸟
    c++初级中级也是菜鸟
    只需看前10个回复,就再次肯定了我n年前的判断。
    站的高度不同,所以观点不同。
    站的高度不同,所以你无法理解此高度的观点
    说出来,你们也无法理解。索性让你们热烈讨论吧。

  16. @hhb

    我以前做过反汇编,也做过PC游戏,现在做手机游戏。
    以我的经验,游戏里面用汇编优化,主要是利用多媒体指令进行优化而已,因为这部分C/C++没办法做到这点,当然可以开启编译器指令中对SSE指令优化,但是一般没那么做。SSE有多个版本,兼容不同的CPU,SSE主要也是能64处理数据。
    不管C++还是Java,对Google这种平台开发商而言,他做的就是想让更多的开发者参与,从而有更多的手机产品用以手机用户。
    还有游戏并非大量使用汇编优化,至少PC引擎是那样的。PC优化最先考虑的是渲染,这个跟D3D有关,汇编几乎用不到。

    看到那么多人回帖,每次讨论的都是那个恒古不变的话题,语言优劣之争。 有什么意思。走自己的路让别人去说吧。 大家的产品见分晓。而不是争那么多没用的理论。

  17. mj2324 :
    用java的是菜鸟
    c++初级中级也是菜鸟
    只需看前10个回复,就再次肯定了我n年前的判断。
    站的高度不同,所以观点不同。
    站的高度不同,所以你无法理解此高度的观点
    说出来,你们也无法理解。索性让你们热烈讨论吧。

    装 B 吧!

  18. 说实话 我不太关注Google 的安卓 系统 ,最近才关注了下 ,发现居然是用java 开发应用程序 !
    和楼主有相同的困惑!!!

  19. > 如果Android的Java一切都好,既然C/C++的跨平台那么差,学习成本那么大,为什么还要反而支持C/C++?

    虽然是老帖,还是冒个泡。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的原因。道理一直都是这么简单。

  20. 第二个问题不是废话吗?当然是用户更重要了!!!程序的执行结果最终还不是交给用户!!!估计google就是基于这个理由才让android支持纯C/C++的,毕竟更流畅总比很流畅的要好。还有一点,首先,我要感谢java,它让我迅速进入编程世界,领悟软件设计,软件工程,但是学了编译原理和汇编以后,java的内部实现机制开始让我有点想吐,结合软件工程,编译原理,汇编和几个java项目经验,我终于总结出了两个个肤浅的观点:一:java程序消耗一大堆内存和cpu时钟频率去讨好程序员,而不是用户。二:我不想否认其他程序语言,但是我觉得,桌面应用程序的开发语言有c/c++就够了(当然应用程序里面的脚本语言javascript,actionscript之类的东西不能算进来)。

  21. 作为程序员,我不知道这是不是帮用户说话——不要满足于很流畅!!!我们要的是更流畅!!!

  22. 各有各长处吧。
    Object C 和 C++ 居然都能互相喷起来…… 我都用过,感觉确实各有长处。
    我是接触C与C++入门的, Java是后来才学的,但基本不喜欢用。
    在手机这种平台上开发本来就应该更加注重效率与合理的资源利用,我仍然坚持认为应该推出C\C++的API。

  23. 那不跟 塞班 一样,塞班不是就是 c/c++ 开发的,

    还不是 不行了,

    手机 好不好 跟 用什么语言没有关系,sha b 些,

  24. ttand :

    不辣的老姜 :
    C++是一种脑残语言。支持C++还不如支持Objective C。

    得了,objc才脑残,乔布斯的偏执拍脑袋决定的东西.
    我的电脑上没有一丝一毫的objc编写的东西.你敢说你的平台上没有cpp编译的东西吗?

    幽默 :)

  25. 我认为, 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确实是一个不错的想法, 可是您有考虑过有多少公司和开发者愿意将自己的源代码做成安装包发布呢?

  26. @testmore
    还是觉得这个观点最靠谱。
    看了很多评论,都没离开技术的角度,为什么大家不能从更大的范畴上讨论问题呢?
    怎么都该是公司战略决定语言,而不是语言决定公司战略。

  27. 语言只是一种方法,我们只是想实现一个需求,我也比较排斥java,可是看到java不断更新的内容,也是羡慕的很,不断有新的技术,方法 比起C++总在设计模式和代码优化上拼命下功夫 java也是很厉害的

  28. 很明显,Android NDK采用C++编写之后还是生成.APK运行在Dalvik虚拟机上,使用纯C写出来的东西生成的并不是纯C的东西。

发表回复

您的电子邮箱地址不会被公开。