java语言和C/C++语言的关系

本文解析了Java语言如何通过JNI机制调用C/C++代码,特别是在Android平台上的实现细节。介绍了Java应用程序如何编译为.dex文件,以及虚拟机如何解释执行这一过程。同时,文章还探讨了Android核心库的构成及其本地实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

以下是自己的一些个人理解,不一定正确。

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++组成。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值