赞
踩
Java 作为一种编程语言,具有许多良好的功能,使其成为应用程序开发的首选语言。它独立于平台(因为虚拟机执行)、JIT 编译、多线程支持以及为程序员提供的富有表现力的简单语法。由于其与平台无关的特性,Java 包可以跨 CPU 架构移植,这使得库开发变得更加容易,从而增强了插件、构建工具和实用程序包的整体生态系统。
功能数量与性能之间恰好存在权衡。像汇编这样的语言具有最少的内存和执行开销,但从程序员的角度来看,其功能数量也最少。在层次结构中向上移动,C 和 C++ 等语言提供了一组良好的功能,同时保持更接近底层硬件。在它们之上的是Java和Python等语言,它们选择通过使用虚拟机来完全消除平台依赖。用这些语言编写的程序有巨大的开销,但却是开发人员的天堂。
JVM 现在可以访问共享库中公开的函数,并且操作系统根据需要执行它们。
正如我们上面的讨论,在我们的系统中,性能比开发人员友好性更重要,这将我们的重点从 Java/Kotlin 转移到了“原生语言”(C/C++)。让我们通过一些示例来了解本机代码的作用及其性能改进,
图:TensorFlow 源代码片段,显示了 arg_max 操作的实现。图片参考:作者截图自GitHub上TensorFlow官方源代码
许多此类系统在牺牲可读性和其他一些因素的情况下维护性能。接下来,我们将简短讨论指令集架构 (ISA) 以及程序执行如何随着 CPU 架构的变化而变化。
图 1:Android 应用程序如何使用 C++ 源代码的描述。
如上图所示,描述了 Android 中 C/C++ 代码的使用,其中存在两个独立的构建过程,一个用于 C/C++ 代码,另一个用于 Java/Kotlin 代码。在本博客中,我们将重点关注 C/C++ 代码构建过程,并了解代码如何与 JVM 通信以进行函数调用。
我们首先简要概述一下 C/C++ 和 Java 程序的编译方式,主要强调 C/C++ 编译的平台特定性。接下来,我们讨论 JNI,它充当 C/C++ 和 Java 代码之间的粘合剂。我们结束对 CMake、共享库和 ABI 的讨论,它们是构建过程的最底层组件。
正如 Reddit 用户建议的那样
pjmlp
,Android 不使用 JVM 在设备上运行应用程序。它有自己的运行时,ART(Android RunTime)继承了 Dalvik 及其自定义字节码 DEX。
让我们开始吧
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。