java语言和C/C++语言的关系
2015-08-21 16:14
239 查看
以下是自己的一些个人理解,不一定正确。
java语言是基于C语言写的,也就是说java语言的核心库的本地实现是C和C++语言实现的,最终还是调用了Libc库。libc再往下就是内核。
android的应用程序,由java编译.class再编译成.dex。dex再由虚拟机来解释成CPU认识的二进制,这些二进制直接放在了内存中。虚拟机在解释的过程中会去走系统调用。这就形成了java语言间接的走
系统调用这一步。java语言想要调用C/C++,必须经过JNI这种机制,
而虚拟机在解释dex时,解释到jni这种写法时,会去调用C和C++。也即是说jni这种机制是虚拟机来解释的。
具体就是.dex去调用system/lib/下的*_jni.so时,是jni来实现的,而虚拟机认识这种关系。*_jni.so已经是二进制了。*_jni.so在生成时去链接了libc.so。
之所以虚拟机知道把dex解释成MIPS的二进制指令,使用为虚拟机是之前已经被MIPS的相应工具链编译了。
android5.1 有libcore目录,存放了android的核心库,这个目录中的java部分最终被打包为core.jar包。经过安装放在了目标目录的system/framework/下。libcore中的C/C++ 代码被编译为libjavacore.a静态库,这个库是java核心库的本地代码。也就是说android的核心库是由java的核心库和java核心库的本地代码C/C++组成。
java语言是基于C语言写的,也就是说java语言的核心库的本地实现是C和C++语言实现的,最终还是调用了Libc库。libc再往下就是内核。
android的应用程序,由java编译.class再编译成.dex。dex再由虚拟机来解释成CPU认识的二进制,这些二进制直接放在了内存中。虚拟机在解释的过程中会去走系统调用。这就形成了java语言间接的走
系统调用这一步。java语言想要调用C/C++,必须经过JNI这种机制,
而虚拟机在解释dex时,解释到jni这种写法时,会去调用C和C++。也即是说jni这种机制是虚拟机来解释的。
具体就是.dex去调用system/lib/下的*_jni.so时,是jni来实现的,而虚拟机认识这种关系。*_jni.so已经是二进制了。*_jni.so在生成时去链接了libc.so。
之所以虚拟机知道把dex解释成MIPS的二进制指令,使用为虚拟机是之前已经被MIPS的相应工具链编译了。
android5.1 有libcore目录,存放了android的核心库,这个目录中的java部分最终被打包为core.jar包。经过安装放在了目标目录的system/framework/下。libcore中的C/C++ 代码被编译为libjavacore.a静态库,这个库是java核心库的本地代码。也就是说android的核心库是由java的核心库和java核心库的本地代码C/C++组成。
相关文章推荐
- Z字形扫描
- C++11 右值引用与move语义
- C语言的static和extern关键字的使用
- C/C++编程题之计算一个数字的立方根
- C++类模板的三种特化
- 分步编译一个C语言文件
- 黑马程序员-[C语言-指针和文件操作]学习日记(四)
- C++无名命名空间详解
- C++并发编程学习笔记<1> 入门
- 浅谈C语言中的联合体
- C++ Primer 5e chapter 9.1
- c++ 中文分词介绍
- C语言提高之技术模型层次、学习标准、特点、内存四区、函数调用模型
- C++模板函数和模板类的诠释
- 黑马程序员-[C语言字符串和数组]学习日记(三)
- C++ __asm关键字
- Log4j日志级别
- c++primer之函数重载
- C语言的void*指针使用
- C/C++的类型安全