java探索之native方法源码实现
java探索之native方法源码实现
背景
不晓得小伙伴们在学习java
时有没有遇到过使用native
关键字修饰的方法,我记得有一次好奇java
类的基类Object.java
里到底有些什么,于是就打开了jdk
的源码看了一下;
不要问我jdk的源码怎么看,去哪里看,丑拒;
以下是Object.java
的源码,可以看出基本都是native
修饰的方法且并没有方法体;
package java.lang;public class Object {private static native void registerNatives();static {registerNatives();}public final native Class<?> getClass();public native int hashCode();public boolean equals(Object obj) {return (this == obj);}protected native Object clone() throws CloneNotSupportedException;public String toString() {return getClass().getName() + "@" + Integer.toHexString(hashCode());}public final native void notify();public final native void notifyAll();public final native void wait(long timeout) throws InterruptedException;public final void wait(long timeout, int nanos) throws InterruptedException {···wait(timeout);}public final void wait() throws InterruptedException {wait(0);}protected void finalize() throws Throwable { }
}
上网查询了一下,得到一个简单的结论,native
是java
本地接口;··· 懵逼中···
上网搜索JNI(Java Native Interface),可获取详细信息,此处不多言;
当时只晓得这些本地方法使用c语言
编写的,于是一直想找到这些native
方法的实现拿来看一看,就在不久前这个愿望实现了,下面介绍过程;
源码
根据CSDN中的一篇博客的提示,找到了下载openjdk的源码的下载地址;
可以选择jdk
的版本,这里选择jdk1.8版本进行下载;
提示:
RI Source Code
The source code of the RI binaries is available under the GPLv2 in a single zip file (md5) 121 MB.
找到如上一句话,点击zip file
即可下载;
下载完成后进行解压;
进入 openjdk -> jdk -> src 目录下;
目录下有7个目录,每一个目录下基本都有一个native
目录(有些没有),其中有6个目录名都是操作系统的种类名称,还有一个是share
目录;
含义就是:
share
目录的native
下是 平台无关的实现;
其他都是各个系统的的定制实现,
这大概就是java
语言可以跨平台使用的一个必要的步骤吧,需要为每一类操作系统定制化一些实现。
以下为object.c
源码
#include <stdio.h>
#include <signal.h>
#include <limits.h>#include "jni.h"
#include "jni_util.h"
#include "jvm.h"#include "java_lang_Object.h"static JNINativeMethod methods[] = {{"hashCode", "()I", (void *)&JVM_IHashCode},{"wait", "(J)V", (void *)&JVM_MonitorWait},{"notify", "()V", (void *)&JVM_MonitorNotify},{"notifyAll", "()V", (void *)&JVM_MonitorNotifyAll},{"clone", "()Ljava/lang/Object;", (void *)&JVM_Clone},
};JNIEXPORT void JNICALL
Java_java_lang_Object_registerNatives(JNIEnv *env, jclass cls)
{(*env)->RegisterNatives(env, cls,methods, sizeof(methods)/sizeof(methods[0]));
}JNIEXPORT jclass JNICALL
Java_java_lang_Object_getClass(JNIEnv *env, jobject this)
{if (this == NULL) {JNU_ThrowNullPointerException(env, NULL);return 0;} else {return (*env)->GetObjectClass(env, this);}
}
其他下载地址
- jdk7
- jdk8
- jdk9
- jdk10
- jdk11
完成,睡觉。
java探索之native方法源码实现相关推荐
- Java线程池execute()方法源码解析
先看作者给出的注释来理解线程池到底有什么作用 * Thread pools address two different problems: they usually * provide improve ...
- java的Thread类start0方法源码
带着几个问题去看源码 1.如何找到native方法的源码 2.Java的Thread对象.JavaThread.OSThread.操作系统线程 3.Java线程与操作系统线程的关联 4.Java线程保 ...
- 深入java并发包源码(三)AQS独占方法源码分析
深入java并发包源码(一)简介 深入java并发包源码(二)AQS的介绍与使用 深入java并发包源码(三)AQS独占方法源码分析 AQS 的实现原理 学完用 AQS 自定义一个锁以后,我们可以来看 ...
- Java Executor源码解析(3)—ThreadPoolExecutor线程池execute核心方法源码【一万字】
基于JDK1.8详细介绍了ThreadPoolExecutor线程池的execute方法源码! 上一篇文章中,我们介绍了:Java Executor源码解析(2)-ThreadPoolExecutor ...
- java计算机毕业设计校园周边美食探索及分享平台源码+数据库+系统+lw文档+mybatis+运行部署
java计算机毕业设计校园周边美食探索及分享平台源码+数据库+系统+lw文档+mybatis+运行部署 java计算机毕业设计校园周边美食探索及分享平台源码+数据库+系统+lw文档+mybatis+运 ...
- (十三)Java工具类StringUtils中strip、stripStart、stripEnd剥离方法源码详解
1. strip方法源码解析 public static String strip(String str){return strip(str, null);} 源码解析:调用strip方法,参数是字符 ...
- Android --- IjkPlayer 阅读native层源码之解码成功后的音频数据如何发送回Android播放(九)
整章目录:Android------- IjkPlayer 源码学习目录 本篇会有很多源代码,请注意阅读每行代码上面的注释. 本篇介绍的主要内容为上图红框圈起部分: 在前面介绍了如何将一个AvPack ...
- Android ---- Ijkplayer阅读native层源码之IjkMediaPlayer_prepareAsync(五)
整章目录:Android------- IjkPlayer 源码学习目录 本篇会有很多源代码,请注意阅读每行代码上面的注释. 本篇介绍的主要内容为上图红框圈起部分: IjkMediaPlayer_pr ...
- java连接mongodb_java连接mongodb源码解读
用mongdb也大半年了,一直是业务上的逻辑实现了就ok.然而这样并不能进步--因此今天查了查java连接mongodb驱动的源码,搜到的各种信息整合一下,方便以后深入的使用. 先贴连接数据库代码Li ...
- java.util.concurrent.locks.Condition 源码
2019独角兽企业重金招聘Python工程师标准>>> 相关类图: 使用Condition和 object作为条件队列的区别: object: 只能绑定一个内部队列,使用notify ...
最新文章
- Android开源控件ViewPager Indicator的使用方法
- SpringMVC框架 学习DAY_02 : 接收请求参数/向模板页面转发数据/重定向与转发 /Session
- 计算机科学讨论,第七章计算机科学讨论报告
- 由“深”至“广”,探索2022音视频技术的无限可能
- 2018.09.19 atcoder AtCoDeer and Election Report(贪心)
- arcpy 实现新增字段合并字段
- mobi文件怎么转化为PDF
- 测试用例设计方法详解
- java中分解json数据,java解析JSON数据详解
- excel怎么输入度分秒,并转换为可编辑文本格式
- 蚂蚁金服刘伟光:我们为什么要科技开放
- bc vc投资_天使投资、VC 以及 PE 的区别是什么?
- 六度分离_hdu_1869(floyd算法).java
- 【背包问题】基于matlab禁忌搜索算法求解背包问题【含Matlab源码 373期】
- ORA-01439: 要更改数据类型, 则要修改的列必须为空
- 【模电实验】基尔霍夫定律、叠加定理和戴维南定理验证实验
- 去哪儿2017校园招聘笔试题——获得文件扩展名filename extension
- 2022 GopherChina 想听什么由你做主!
- [Usaco2008 Oct]笨重的石子 DP
- Geodetic集合
热门文章
- 高校舆情分析python_微博的高校舆情监控系统设计
- 【夏虫语冰】visio2013安装出错,您输入的产品密钥无法在此计算机上使用,错误25004
- OPPO小布助手算法系统的探索、实践与思考
- windos不能在本地计算机启动服务器,WDS 服务器可能无法启动 - Windows Server | Microsoft Docs...
- 2019年7月Github上最热门的Java开源项目
- CISSP 认证的 12 部优秀 CISSP 书籍和学习指南+学习网站
- 【分享】“金蝶云星辰“ 在集简云平台集成应用的常见问题与解决方案
- 超小型射频接头SMP/SSMP
- 金万维异速联服务器重装,金万维异速联服务器配置说明
- 无法读源文件或磁盘怎么办?