如何找到java对应的c/c++源码
很多时候java经常被c鄙视,因为c说我是你的基础,但java竟然有如此强的生命力就必然有其存在的价值。本文不探讨各种开发语言的优劣,仅仅介绍如何找到java对应c/c++实现的源码。当我们追究一个java类到jdk库的时候,可能会遇到一个方法被声明为native,是的,它表明是一个由c/c++实现的本地方法,在运行时JVM将通过一定的映射规则找到相应的c/c++函数。
如果你使用过jni对这种映射就比较熟悉,如一个java类InvokeCpp,它调用的就是Test.dll动态链接库的hello函数。实现动态链接库的C要包含头文件和C文件,java也提供了javah工具方便开发者生成头文件。详细如何实现这里不再赘述,不在本文讨论范围,最后java调用的是C语言中Java_com_seaboat_cpp_InvokeCpp_hello函数,可以看出是由Java、包名、方法三个用下划线拼装起来的一个函数名。
package com.seaboat.cpp;
public class InvokeCpp{
static{
System.loadLibrary("Test");
}
public native void hello(String str);
public static void main(String[] args){
new InvokeCpp().hello("hello");
}
}
讨论完jni后回到正题,要查看jdk中的native方法首先要把openjdk源码下下来,它的目录结构如下,jdk/src下基本包含了大多jdk的native方法,其中share是多个系统共享的,其他linux、solaris、windows则是各自操作系统独有的。
假如我们要找java.lang.String类中的public native String intern() 本地方法则可以在share/native/java/lang目录下找到String.c,Java_java_lang_String_intern便是对应的C函数源码。
喜欢研究java的同学可以交个朋友,下面是本人的微信号:
如何找到java对应的c/c++源码的更多相关文章
- 图解 Java IO : 二、FilenameFilter源码
Writer :BYSocket(泥沙砖瓦浆木匠) 微 博:BYSocket 豆 瓣:BYSocket FaceBook:BYSocket Twitter ...
- Java并发系列[2]----AbstractQueuedSynchronizer源码分析之独占模式
在上一篇<Java并发系列[1]----AbstractQueuedSynchronizer源码分析之概要分析>中我们介绍了AbstractQueuedSynchronizer基本的一些概 ...
- Java并发系列[3]----AbstractQueuedSynchronizer源码分析之共享模式
通过上一篇的分析,我们知道了独占模式获取锁有三种方式,分别是不响应线程中断获取,响应线程中断获取,设置超时时间获取.在共享模式下获取锁的方式也是这三种,而且基本上都是大同小异,我们搞清楚了一种就能很快 ...
- 【JVM】深度分析Java的ClassLoader机制(源码级别)
原文:深度分析Java的ClassLoader机制(源码级别) 为了更好的理解类的加载机制,我们来深入研究一下ClassLoader和他的loadClass()方法. 源码分析 public abst ...
- java集合系列之HashMap源码
java集合系列之HashMap源码 HashMap的源码可真不好消化!!! 首先简单介绍一下HashMap集合的特点.HashMap存放键值对,键值对封装在Node(代码如下,比较简单,不再介绍)节 ...
- java集合系列之ArrayList源码分析
java集合系列之ArrayList源码分析(基于jdk1.8) ArrayList简介 ArrayList时List接口的一个非常重要的实现子类,它的底层是通过动态数组实现的,因此它具备查询速度快, ...
- JAVA设计模式-动态代理(Proxy)源码分析
在文章:JAVA设计模式-动态代理(Proxy)示例及说明中,为动态代理设计模式举了一个小小的例子,那么这篇文章就来分析一下源码的实现. 一,Proxy.newProxyInstance方法 @Cal ...
- 死磕 java同步系列之StampedLock源码解析
问题 (1)StampedLock是什么? (2)StampedLock具有什么特性? (3)StampedLock是否支持可重入? (4)StampedLock与ReentrantReadWrite ...
- 死磕 java同步系列之ReentrantLock源码解析(二)——条件锁
问题 (1)条件锁是什么? (2)条件锁适用于什么场景? (3)条件锁的await()是在其它线程signal()的时候唤醒的吗? 简介 条件锁,是指在获取锁之后发现当前业务场景自己无法处理,而需要等 ...
随机推荐
- Codeforces Round#409/VK-Cup 2017 Round2
来自FallDream的博客,未经允许,请勿转载,谢谢. 和ditoly组队打VK-Cup,起了个名字叫Vegetable Chicken(意思显然),然后昨天我做AB他切C 很不幸的是.....我写 ...
- Linux学习之CentOS(五)--CentOS下VMware-Tools安装
已经进入到了Linux学习之CentOS的第六篇随笔了,所以这里就介绍一下VMware-Tools的安装. VMware-Tools的安装 VMware-Tools 主要的功能就是让用户在虚拟机和真实 ...
- mysql insert插入时实现如果数据表中主键重复则更新,没有重复则插入的四种方法
[CSDN下载] Powerdesigner 设计主键code不能重复等问题 [CSDN博客] Oracle中用一个序列给两个表创建主键自增功能的后果 [CSDN博客] MySQL自增主键删除后重复问 ...
- 初识RabbitMQ系列之三:.net 如何使用RabbitMQ
话不多说,直接上代码! 一:搭建一个解决方案框架:RabbitMQ_Demo 其中包含4个部分: 1:RabbitMQ 公用类库项目 2:一个生产者控制台项目 3:两个消费者控制台项目 项目结构如图: ...
- 【转载】RAID写惩罚(Write Penalty)与IOPS计算
浅谈RAID写惩罚(Write Penalty)与IOPS计算 Character is what you are in the dark. 暗处最能反映一个人真正品格. ---------Apri ...
- C++并发高级接口:std::async和std::future
std::async和std::future std::async创建一个后台线程执行传递的任务,这个任务只要是callable object均可,然后返回一个std::future.future储存 ...
- Docker 内核名字空间
Docker 容器和 LXC 容器很相似,所提供的安全特性也差不多.当用 docker run 启动一个容器时,在后台 Docker 为容器创建了一个独立的名字空间和控制组集合. 名字空间提供了最基础 ...
- Python3 条件控制
if 语句 Python中if语句的一般形式如下所示: if condition_1: statement_block_1 elif condition_2: statement_block_2 el ...
- Linux中MySQL忽略表中字段大小写
linux 下,mysql 的表面默认是区分大小写的,windows 下默认不区分大小写,我们大多数在windows 下开发,之后迁移到linux(特别是带有Hibernate的工程),可以修改配置是 ...
- Touch 方法&属性 映射工具
Touch 方法&属性 映射工具(0.5 版本) 标签 : github 线上后门与接口调试: 原先需要测试一个接口(如Dubbo.DAO), 或为线上留后门, 需要写大量的Web层(Api. ...