阅读Java Native源码前的准备
前言
读java native源代码时,我们一般会去网站下载openjdk8源码http://download.java.net/openjdk/jdk8/promoted/b132/openjdk-8-src-b132-03_mar_2014.zip ,然后进行分析,随后很多文章会让你编译。其实,如果只是为了分析源码,完全不用编译,直接找到hotspot文件夹下的src文件夹查看即可,这里就是hotspot的源码。
注意:官网的源码下载地址写错了,它写成了http://www.java.net/download/openjdk/jdk8/promoted/b132/openjdk-8-src-b132-03_mar_2014.zip,这个网址是打不开的
存在的问题
源码中的include 路径不全,导致很多函数无法跳转,只得手动查找,很不方便。以 ./src/cpu/sparc/vm/assembler_sparc.cpp
文件为例,原始代码是这样的:
#include "precompiled.hpp"
#include "asm/assembler.hpp"
#include "asm/assembler.inline.hpp"
int AbstractAssembler::code_fill_byte() {
return 0x00; // illegal instruction 0x00000000
}
我们希望是这样的:
#include "./src/share/vm/precompiled/precompiled.hpp"
#include "./src/share/vm/asm/assembler.hpp"
#include "./src/share/vm/asm/assembler.inline.hpp"
int AbstractAssembler::code_fill_byte() {
return 0x00; // illegal instruction 0x00000000
}
分析问题&解决方案
当然,我们可以手动寻找对应的头文件,然后一个一个补全;但是文件数量有上千个,这样会耗费许多时间,也因此有了本项目——自动补全include中的路径。查看不同文件中的include路径,发现有两大类,一类是include "precompiled.hpp"
,一类是包含在文件夹./src/share/vm
下的各个头文件,如asm
、prims
、oop
、utilities
等,因此解决步骤如下:
- 对于
"precompiled.hpp",我们可以直接用编辑器将其全部替换为
include "./src/share/vm/precompiled/precompiled.hpp"`; - 对于其他诸如
include "asm/assembler.hpp"
、#include "oops/oop.inline.hpp"
、#include "utilities/accessFlags.hpp"
等依赖不同文件路径的头文件,利用本项目中的程序自动将其补全。
源码
参见https://github.com/xiaoxi666/ModifyIncludePath
实现原理
遍历src文件夹下的所有文件,找出后缀为
cpp
、hpp
、c
、h
的文件,将其保存在List中;同时将对应的文件夹路径保存在Set中(之所以选择Set而不是List是因为同一文件夹下可能有很多文件,而文件夹保存一次就好);处理List中保存的文件,每个文件处理时读取Set中匹配的文件夹,将诸如
#include "asm
等形式替换成#include "./src/share/vm/asm
,即可。
其他问题
还有一些文件依赖于特定的平台,如./src/share/vm/utilities/copy.hpp
中:
#ifdef TARGET_ARCH_x86
# include "copy_x86.hpp"
#endif
#ifdef TARGET_ARCH_sparc
# include "copy_sparc.hpp"
#endif
#ifdef TARGET_ARCH_zero
# include "copy_zero.hpp"
#endif
#ifdef TARGET_ARCH_arm
# include "copy_arm.hpp"
#endif
#ifdef TARGET_ARCH_ppc
# include "copy_ppc.hpp"
#endif
此种代码程序并未处理,因此依赖平台的函数还是有可能找不到,有需要的可以将程序中的
static String startInclude = "#include \"";
替换为static String startInclude = "# include \"";
再运行一次即可(注意#和include之间多了一个空格)。
运行须知
本程序运行时,建议将hotspot的源码目录src单独放在工程下的一个文件夹(本项目中为/Resource
)中,防止混乱。
阅读Java Native源码前的准备的更多相关文章
- Java——LinkedHashMap源码解析
以下针对JDK 1.8版本中的LinkedHashMap进行分析. 对于HashMap的源码解析,可阅读Java--HashMap源码解析 概述 哈希表和链表基于Map接口的实现,其具有可预测的迭 ...
- Java集合源码阅读之HashMap
基于jdk1.8的HashMap源码分析. 引用于:http://blog.stormma.me/2017/05/31/Java%E9%9B%86%E5%90%88%E6%BA%90%E7%A0%81 ...
- 《React Native 精解与实战》书籍连载「React Native 源码学习方法及其他资源」
此系列文章将整合我的 React 视频教程与 React Native 书籍中的精华部分,给大家介绍 React Native 源码学习方法及其他资源. 最后的章节给大家介绍 React Native ...
- java集合源码分析(三):ArrayList
概述 在前文:java集合源码分析(二):List与AbstractList 和 java集合源码分析(一):Collection 与 AbstractCollection 中,我们大致了解了从 Co ...
- android新闻项目、饮食助手、下拉刷新、自定义View进度条、ReactNative阅读器等源码
Android精选源码 Android仿照36Kr官方新闻项目课程源码 一个优雅美观的下拉刷新布局,众多样式可选 安卓版本的VegaScroll滚动布局 android物流详情的弹框 健身饮食记录助手 ...
- Java集合源码分析(三)LinkedList
LinkedList简介 LinkedList是基于双向循环链表(从源码中可以很容易看出)实现的,除了可以当做链表来操作外,它还可以当做栈.队列和双端队列来使用. LinkedList同样是非线程安全 ...
- Java集合源码分析(二)ArrayList
ArrayList简介 ArrayList是基于数组实现的,是一个动态数组,其容量能自动增长,类似于C语言中的动态申请内存,动态增长内存. ArrayList不是线程安全的,只能用在单线程环境下,多线 ...
- 【转】Java HashMap 源码解析(好文章)
.fluid-width-video-wrapper { width: 100%; position: relative; padding: 0; } .fluid-width-video-wra ...
- Java Reference 源码分析
@(Java)[Reference] Java Reference 源码分析 Reference对象封装了其它对象的引用,可以和普通的对象一样操作,在一定的限制条件下,支持和垃圾收集器的交互.即可以使 ...
随机推荐
- Bootstrap3.3.7
页面的布局 <-!不让文字超出左右屏幕--> <style> .demo { word-wrap: break-word; } </style> 他们为那个模板中的 ...
- PYTHON黑帽编程 4.1 SNIFFER(嗅探器)之数据捕获--补充
荒废了一个多月了,重新捡起来,手生了不少.发现在<4.1下>的文章里没有 提到pcap库,实在是不应该. 在网络数据分析的工具中,tcpdump绝对是大名鼎鼎,tcpdump底层是libp ...
- [转]Kaldi命令词识别
转自: http://www.jianshu.com/p/5b19605792ab?utm_campaign=maleskine&utm_content=note&utm_medium ...
- 10个经典的Java面试题集合
这里有10个经典的Java面试题,也为大家列出了答案.这是Java开发人员面试经常容易遇到的问题,相信你了解和掌握之后一定会有所提高.让我们一起来看看吧. 1.Java的HashMap是如何工作的? ...
- Go语言生成随机数
在Go语言中生成随机数需要使用Seed(value)函数来提供伪随机数生成种子,一般情况下都会使用当前时间的纳秒数字,如果不在生成随机数之前调用该函数,那么每次生成的随机数都是一样的. 函数rand. ...
- Kubenetes 核心概念理解
Kubernetes 是一个具有自动控制 .自动纠错功能的资源管理系统 可以把 Node , Pod , Replication Controller , Service 等都看做是一种 " ...
- 深入分析Java I/O的工作机制 (三)网络I/O的工作机制 很详细
3.网络I/O的工作机制 前言:数据从一台主机(服务端)发送到网络中的另一台主机(客户端)需要经过很多步骤:首先需要有相互沟通的意向.其次要有能够沟通的物理渠道(物理链路):是通过电话,还是直接面对面 ...
- 十大经典排序算法(python实现)(原创)
个人最喜欢的排序方法是非比较类的计数排序,简单粗暴.专治花里胡哨!!! 使用场景: 1,空间复杂度 越低越好.n值较大: 堆排序 O(nlog2n) O(1) 2,无空间复杂度要求.n值较大: 桶排序 ...
- mysql 架构篇系列 2 复制架构一主一从搭建(异步复制)
一. 环境准备 1.1 主库环境(172.168.18.201) 环境 说明 查看脚本 操作系统版本 CentOS Linux release 7.4.1708 (Core) cat /etc/red ...
- 简易远程消息交换协议SRMP
一.SRMP目标定位 经过十多年实战经验积累以及多方共同讨论,新生命团队(https://github.com/newlifex)制订了一种简单而又具有较好扩展性的RPC(Remote Procedu ...