C/c++源文件直接交叉编译生成.so文件供安卓应用程序调用,可以吗?
Jni调用就行了,是要按规则写接口api,如果接口很多,也没法,那是你的业务问题,要重新设计业务逻辑。
我们之前用的C++单独交叉编译一个进程,和安卓界面用tcp通信,如果接口多也以为着协议多,一样的。方舟编译器是将java代码像C++静态编译,那么为什么安卓当时一开始为啥不用C++?
作为一个被C++差点整秃了的前程序员,我觉得我很有资格来回答这个问题(拨一拨头上为数不多的几根毛)
方舟编译器到底意味着什么?
方舟编译器基于GCC开发,是一款交叉编译器套件,它包括了C、C++、Fortran的前端,同时也包含了这些语言的库,于今年4月公布,预计在2020年全面完善开源(目前在部分华为机型上已经适配)。
需要强调的是,方舟是一款交叉式的编译套件,他的工作模式还是传统的预编译—编译—汇编—链接这样的流程,在效率上可能会有提升,但提升的程度怎么样,我没有亲身体会过,听身边用华为的朋友讲,感觉不错,但实际如何就不得而知了。
回到问题本身——为啥不用C++?
众所周知,C++一门非常强大的编程语言,可面向对象的同时还能兼容结构化编程。同时,C++也是是世界上最为复杂,难度最高的编程语言之一。
和另一门主流开发语言Java相比,C++有个致命的缺陷:移植性。只要换个操作平台,就得重新编译,浪费时间浪费精力还浪费***。同样是面向对象,JAVA要比C++简单太多,语句精简,结构清晰,单单一个内存自动管理就要比C++高到不知哪里去了。另外,j***a的开发环境非常好,群体众多,连续多年占据开发语言榜首的位置。所以很多公司都选择使用j***a作为开发语言,其中就包括安卓现在的“老父亲”google。
华为曾宣称会将方舟编译器完整开源,帮助开发者构建完整的工具链。届时华为还将提供代码调优工具,开发者可以选择根据工具的优化建议来调整自己的代码,和方舟编译器配合获得更优的执行效果,对于整个市场来讲是个好消息。
华为在技术上是比较保守的,这和国内目前的大环境也相对吻合,很难讲会对华为自身或者其他厂商造成什么影响,不过,当下华为已经选择了开源路线,想来今后的举措即使有差池,也会遵守这一纲领。
谷歌提供给开发者的常见工具叫android sdk(Software Development Kit软件开发工具包),这个主要是使用J***a(现在添加了对kotlin的支持)。同时还提供了另一套[_a***_]ndk(native development kit),这个是支持开发者使用c/c++进行应用开发的。
也就是说谷歌一直支持开发商使用多种语言开发安卓应用,但是有个现实的问题是J***a程序员多而且便宜,c/c++程序员少而且贵,J***a代码更好生产和维护,所以更多的应用开发商会选择J***a。
而且在方舟编译器之前,安卓运行时已经支持预编译AOT(Ahead Of Time)。工作方式是在应用安装的过程中,将dalvik字节码转换成Arm本地指令集。但APK在运行时,还是需要依赖虚拟机。
方舟的这个编译器,将转换过程提前到生产过程,这个应该能够带来巨大的性能提升。毕竟电脑的CPU和手机cpu性能不是一个档次,而且编译过程对速度不敏感,安装过程则对速度极度敏感,编译过程可以进行更深度的优化。另一个是完全抛弃了虚拟机,理论上也会带来性能的巨大提升。
这里要追溯到unix了。相比苹果的IOS操作系统,安卓操作系统提供了对J***A的支持。而苹果的IOS是重写了unix,IOS设计之初,就提供了对C或这类C如OBJECT C等语言的支持。而J***A是运行在J***A虚拟机基础上的,其垃圾回收机制是要牺牲部分性能的。所以,从安卓架构之初,性能上就存在缺陷(相比IOS哈)。
不知我的回答是否令你满意?
Google愚蠢 用后台开发的经验套到终端设备。忽略了用户设备对实时性的高要求!华为因为在各类硬件上做过多年底层开发,更能抓住用户需求!加上持续的研发投入,在手机系统上超越google只是时间问题
因为C++跨平台性不如J***a好。C++有时候编译依赖动态链接库,而动态链接库实际上是随系统环境决定的,所以很多时候会出现动态链接库不存在或者版本不正确的问题,如果这个问题放在手机上,就需要所有的设备都更新到开发者使用平台以后的版本才行,也就是不向前兼容,虽然在安装上面可能有好处,但是大大提高了安装失败的几率,对于移动app来说,并不方便,也不可行,所以才***用建立在JVM上面的J***a,使用JVM来摆脱对底层的依赖。