阅读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对象封装了其它对象的引用,可以和普通的对象一样操作,在一定的限制条件下,支持和垃圾收集器的交互.即可以使 ...
随机推荐
- 《HTTP权威指南》4-连接管理
TCP连接 TCP/IP是全球计算机及网络设备都在使用的一种常见的分组交换网络分层协议集客户端应用程序可以打开一条TCP/IP连接.连接到可能运行在世界任何地方的服务器应用程序 TCP的可靠数据管道 ...
- Spring Boot 2 - 使用CommandLineRunner与ApplicationRunner
本篇文章我们将探讨CommandLineRunner和ApplicationRunner的使用. 在阅读本篇文章之前,你可以新建一个工程,写一些关于本篇内容代码,这样会加深你对本文内容的理解,关于如何 ...
- 浅谈 Nginx 的内部核心架构设计
一.前言 Nginx---Ngine X,是一款免费的.自由的.开源的.高性能HTTP服务器和反向代理服务器:也是一个IMAP.POP3.SMTP代理服务器:Nginx以其高性能.稳定性.丰富的功能. ...
- java常见面试题及部分答案
1.Redis常见的存储数据类型 list(列表类型) set(集合类型) zset(有序集合类型) string(字符串类型) hash(散装类型) 2.log4j的级别 debug:日志的最低级别 ...
- Ubuntu下OpenCV版本切换
1.假如安装了opencv以下两个版本: opencv-2.4.13 opencv-3.2.0 2.安装目录分别为: /usr/local/opencv-2.4.13 /usr/local/openc ...
- python(leetcode)-66加一问题
给定一个由整数组成的非空数组所表示的非负整数,在该数的基础上加一. 最高位数字存放在数组的首位, 数组中每个元素只存储一个数字. 你可以假设除了整数 0 之外,这个整数不会以零开头. 示例 1: 输入 ...
- java提高(2)---正则表达式(1)常用符号
正则表达式---常用符号 首先声明,我这里列表的是经常使用的一些符号,如果你想得到全部,那建议你通过API中,搜索Pattern类,会得到所有符号. 字符类 [abc] a.b 或 c(简单类) [^ ...
- 通过Calendar简单解析Date日期,获取年、月、日、星期的数值
有时候项目中需要用到Date的年.月.日.星期的数值.那么解析方法如下: /**解析日期,获取年月日星期*/ private void parseDateToYearMonthDayWeek(Date ...
- 微软新动向之Android和IOS应用 visual studio 2015 Cordova[原创]
自萨蒂亚·纳德拉(Satya Nadella)上任微软CEO以来,可谓是惊喜不断,仿佛让世界尤其是我们.net程序员心中又燃起了希望.先是免费提供 iOS 版和安卓版 Office:然后在 xbox ...
- Django使用Channels实现WebSocket--下篇
希望通过对这两篇文章的学习,能够对Channels有更加深入的了解,使用起来得心应手游刃有余 通过上一篇<Django使用Channels实现WebSocket--上篇>的学习应该对Cha ...