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. WP7用的是.net + XNA游戏平台。这年头用C/C++,赶不上大潮啊,等开发完人家钱都捞光了。

  2. 个人认为,google当初选择java的原因,一是因为java程序员数量庞大,这样在android初期能快速增长app的数量,以app数量抗衡itune store,第二个原因,ios软硬件完全一致,而生产android设备的,无论厂商和硬件平台都有很大差异,这种情况下,java的适应性要好于C/C++,
    如果用C/C++,开发者也不得不为自己的app发布多个平台的版本就,在这样的多硬件版本下,C/Cpp就成为了一种笨拙的方式,很象当年的symbian,
    至于为什么要发布NDK r5支持C/C++,原因可能就很多了,效率性能,用户体验,oracle专利之争,等等都有可能

  3. 笑死我了,C/C++和JAVA哪个好这个问题都争论多久了,还在争论。

    很多年前我是觉得C/C++比JAVA好。后来我发现语言不是问题,用户一点都不关心。用户只关心自己需要用到的东西好不好用。只要用户用到的东西没有让他不爽,他才不关心你是JAVA还是C/C++,甚至你拿一堆垃圾搞出来一个东西他用得爽就行。
    总之,所有编程语言对用户来说都是一样的。

  4. 性能上的问题是一方面,更多的可能是java专利问题,andy当年可能是看中了强大的开源harmony,而且手机J2SE的程序员很多,回头来说不支持C/C++应用开发的OS 还有啥意思呢,无所谓语言啦,还是多看看有些什么好的应用吧,谷歌不要再成为一个SB微软就行,把语言,框架当产品做,一天一个样,我勒个去,真是蹂躏程序员啊!这点做过win app 或者.net 的人都深有体会,MS快点死去吧,看APPLE,从来就不关心语言啥的,框架啥的,Object C 用到极致也就有了现在的i 系列!@陈皓

  5. 关键是打算从谁身上赚钱,针对个人用户就应该最大可能的简化操作难度;针对公司、机构神马的就不必了,不然吃谁去?也就是apple向和ibm向的区别吧

  6. 陈皓 :
    @无限

    连Google自己内部的开发人员都不想用Andorid,而用iPhone(中国谷歌员工应该全体人手一台iPhone了)。因为,Andorid的用户体验还是太差,为什么比iPhone差?原因在哪里?硬件的吗?还是OS的?还是App的?我看是后两者的问题。

    是因为他们不差钱。。。。
    他们可能习Android手机吗?

  7. 我一直学习嵌入式开发,突然看到Andorid,也相搞一台手机自己写些程序给自己用,想着都很酷,但一直开发是用汇编和C,C++,没有学过JAVA,看到你这里的介绍,想了解一下怎么搭建C/C++的Andorid开发环境。

  8. 一个是为什么Android要选用Java。对于嵌入式开发,CPU和内存都很宝贵,居然还使用Java。

    对于这个问题,个人有如下理解。作为一个移动平台,其本身固然重要,但更为重要的是Apps。Google会选择Java作为Android应用开发的语言,是因为Java开发人员在所有开发人员中所占的比重,那么从这个角度来说,势必会使Android的应用快速增长,其二可能是Java易于上手。所以单从快速占领市场份额来看,这是很好的选择。

    个人浅见,请多包涵。

  9. 我喜欢c++,一旦到了new或者申请内存的地方我就兴奋啊。。。。
    做个内存里的舞蹈者。。。哈哈。。java,见鬼去吧

  10. google在NDK中有提到,C/C++开发并不能带来性能的提高,它仍然是被打包成APK,运行在虚拟机之中。只会带来复杂性。

  11. 有个地方不明白,请指教。

    既然GOOGLE不想绑死在arm上,但这个Andriod OS毕竟是C开发的,底层硬件的变化,跟上层的JAVA/C有什么关系呢。要说有变化,也是在.so这些Library去适应底层硬件的变化,跟JVM有什么关系呢。JVM的跨平台应该只限于OS这个级别吧。

  12. 呵呵,那是因为Android是谷歌收购的别人的,而别人从一开始就使用了Java这个语言作为应用的开发工具,而且架构已经做好了,所以一开始谷歌就先不变了。如果仅仅是把C++放到与Java同等的运行级别上,即都是运行在那个虚拟机上,那谷歌就只是为了拥抱C++程序员这么简单,没有别的原因。

  13. 晕,,,我们公司有个android的产品,收费后,,没多久就轻易破了。。java的代码太显露了

  14. 陈皓 :
    嗯,技术人员容易搞这个。不过,我的确不想讨论语言。我想讨论的是对于手机这么一个特殊的终端,重要的不是语言和操作系统,而是用户体验。而目前的Android+Java因为过多地考虑了程序员的开发体验,返回忽略了用户操作体验。

    开始用java也是为了用户,一个啥功能没有的系统谁会用?用他做什么?不可否认,JAVA程序员要比C/C++程序多,开发要比C/C++容易一些,这样,可以让这个平台迅速产出很多软件供用户使用.现在用户多了,程序也多了,用户的要求提高了,要速度了,所以支持C/C++了

  15. 哥不明白楼主所说的:
    ———
    一个是为什么Android要选用Java。对于嵌入式开发,CPU和内存都很宝贵,居然还使用Java。

    —————————-
    哥理解的android系统只是将开发接口做得和java的接口一样而已,而且它本身不是一个jvm,它是一个基于linux内核的手机操作系统,android开发只是像java开发而已,其实并不是java开发…..

  16. iphone爲什麽體驗比android好,應為IOS起步比ANDROID早。根本就不是語言問題。
    开放,封闭根本就是不同的商業模式。沒有什麽好壞。
    google想封閉能封閉起來嗎?APPLE可以自己搞硬件。GOOGLE可不行。所以得依靠ANDROID聯盟來對抗APPLE.

    樓主哎,多學習吧。

  17. haha :iphone爲什麽體驗比android好,應為IOS起步比ANDROID早。根本就不是語言問題。开放,封闭根本就是不同的商業模式。沒有什麽好壞。google想封閉能封閉起來嗎?APPLE可以自己搞硬件。GOOGLE可不行。所以得依靠ANDROID聯盟來對抗APPLE.
    樓主哎,多學習吧。

    ++
    java 性能是不如c,哥是搞java的没有你那么高端,c++程序员是比java程序员注重效率,但是,java程序员,比c++程序员更注重模式,更注重代码怎么重用。想要快速开发还是的java,想要以后维护更容易还是的java,虽然牺牲了性能,硬件发展很快,过几年那点级不足为虑了。

  18. NDK自带的文档说的比较清楚了吧,http://developer.android.com/sdk/ndk/overview.html,摘要如下:
    Android applications run in the Dalvik virtual machine. The NDK allows you to implement parts of your applications using native-code languages such as C and C++. This can provide benefits to certain classes of applications, in the form of reuse of existing code and in some cases increased speed.

    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++,也算是很正常的行为了。

    这是一个多元化的世界,开放系统与封闭系统都能活下去,但目前看来是封闭系统占了上风,后事如何,且拭目以待,哈哈

  19. 现在混合语言编程已经成为潮流。Android上的c/c++与java通过JNI建立桥梁。win上的C#调用c/c++动态库。UI方面的开发还是java、c#等语言开发效率高。

  20. “Java的开发成本比C/C++低”,个人认为,由于C++门槛较高,再加上本来C++相关程序员就少,很难长期低成本的可持续开发,运营一个C++团队的成本很高。

  21. 我个人觉得思维不要局限,是不是可以这样假设一下! 我们假设Google没这么笨,而是很狡猾。那么现在我们假设
    汉堡+咖啡 = Java
    豆浆+油条 = c/c++
    我 = Google
    那么我现在要去美国开家早餐店,直接去卖豆浆油条,估计老火,没多少人接受。先去整个快餐店卖点汉堡咖啡之类的,等我这店越做越大客人越来越多,大家离不开我这店的时候,我开始卖豆浆油条,让大家尝尝鲜,随后我开始1,3,5供应汉堡咖啡,2,4,6供应豆浆油条,更极端点后面只卖豆浆油条~~
    呵呵,现在我做回自己。在我看来Google非常之优秀,作为一家如此优秀的公司让Android回归C/C++的行为是,迷途知返呢?还是大智若愚? 谁来解开正直的内幕~~

  22. 其实你们只是从部分技术和部分市场来看待问题,很肤浅!我对于手机硬件、软件、底层、上层我都很精通,但如果我开发iphone应用,我只能做一个程序员,如果我用安卓平台我可以从TI买个开发板,自己基于安卓可以开发出很多种类产品,不仅仅是手机,而且是软硬结合的产品,iphone只能在软件很小的方面能和安卓比,其余的都没办法和安卓比。

  23. 这么牛逼并淡定着?可以那不同的东西做不同的事情,也可以做相同的事情,表现不一样很正常。因为本来就是不一样~@hbs

  24. 看了博主的这文章很激动啊,如果android的APP真的支持纯C了,那太幸福了。现在去哪里能找一些关于这的学习资料呢?比如开发环境怎么办,我还会回来和你请假的,哈哈!

  25. LS的都能确定自己的资源利用能比虚拟机更棒么?
    虚拟机确实托了个累赘,但是无论对开发者还是用户来说更安全,更可控~
    而且LS的如果都有能力确定自己完美驾驭内存分配了,那么现在不大会是开发应用的了,或许你就在写某语言的RT!

  26. 还有… IOS的运行效率比ANDROID高,真的是语言层次的么?~ O-C难道不要运行虚拟机么? 我没学过O-C,但我不相信.我知道O-C里同样提供了DELEGATE,如果没有GC,这种函数指针资源的销毁就是恶梦!

    ANDROID是个开放的系统,要考虑这个,考虑那个,顾忌多,自然只能找平衡点. 而IOS是封闭的,都是APPLE自己说了算.

    就像XBOX360,同样XNA框架的游戏,在X360上效率比PC上高很多… X360硬件现在看来那么普通,还能制作出那么高品质的游戏,哪怕是XNA下的,对其他平台说不可能!

  27. 希望C++能在移动终端领域有更好的发展,JAVA,C#,C++都用过,但心中的挚爱仍是C++,楼上有个哥们说JAVA程序更多的使用模式,注重重用等,C++难道就不是这样吗,C++让你更自由,写代码如同在创作一件艺术作品,正确,高效,优雅。其实归根到底,语言无优劣,只有使用它的人在更合适它的领域充分发挥它的优势这才是关键。

  28. AntBean1988 :google在NDK中有提到,C/C++开发并不能带来性能的提高,它仍然是被打包成APK,运行在虚拟机之中。只会带来复杂性。

    Using native code does not result in an automatic performance increase, but always increases application complexity. If you have not run into any limitations using the Android framework APIs, you probably do not need the NDK. http://developer.android.com/sdk/ndk/index.html

  29. 是开发人员更重要,还是用户更重要?

    我觉得关于这个问题,可能是用户更重要。开发人员固然重要,但归根结底还是生产者,要满足用户需求,这也是决定一个应用的关键吧。

  30. 这两点肯定是要做一个取舍的,至于怎么做,具体情况而定。我是学c和汇编的,还是注重效率。硬件发展很快,但这不应该成为可以浪费的理由啊,我想着也是为什么android那么吃硬件的原因吧。个人观点,很幼稚,望海涵@的地方

回复 jacoblx 取消回复

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