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 { }
}

上网查询了一下,得到一个简单的结论,nativejava本地接口;··· 懵逼中···
上网搜索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方法源码实现相关推荐

  1. Java线程池execute()方法源码解析

    先看作者给出的注释来理解线程池到底有什么作用 * Thread pools address two different problems: they usually * provide improve ...

  2. java的Thread类start0方法源码

    带着几个问题去看源码 1.如何找到native方法的源码 2.Java的Thread对象.JavaThread.OSThread.操作系统线程 3.Java线程与操作系统线程的关联 4.Java线程保 ...

  3. 深入java并发包源码(三)AQS独占方法源码分析

    深入java并发包源码(一)简介 深入java并发包源码(二)AQS的介绍与使用 深入java并发包源码(三)AQS独占方法源码分析 AQS 的实现原理 学完用 AQS 自定义一个锁以后,我们可以来看 ...

  4. Java Executor源码解析(3)—ThreadPoolExecutor线程池execute核心方法源码【一万字】

    基于JDK1.8详细介绍了ThreadPoolExecutor线程池的execute方法源码! 上一篇文章中,我们介绍了:Java Executor源码解析(2)-ThreadPoolExecutor ...

  5. java计算机毕业设计校园周边美食探索及分享平台源码+数据库+系统+lw文档+mybatis+运行部署

    java计算机毕业设计校园周边美食探索及分享平台源码+数据库+系统+lw文档+mybatis+运行部署 java计算机毕业设计校园周边美食探索及分享平台源码+数据库+系统+lw文档+mybatis+运 ...

  6. (十三)Java工具类StringUtils中strip、stripStart、stripEnd剥离方法源码详解

    1. strip方法源码解析 public static String strip(String str){return strip(str, null);} 源码解析:调用strip方法,参数是字符 ...

  7. Android --- IjkPlayer 阅读native层源码之解码成功后的音频数据如何发送回Android播放(九)

    整章目录:Android------- IjkPlayer 源码学习目录 本篇会有很多源代码,请注意阅读每行代码上面的注释. 本篇介绍的主要内容为上图红框圈起部分: 在前面介绍了如何将一个AvPack ...

  8. Android ---- Ijkplayer阅读native层源码之IjkMediaPlayer_prepareAsync(五)

    整章目录:Android------- IjkPlayer 源码学习目录 本篇会有很多源代码,请注意阅读每行代码上面的注释. 本篇介绍的主要内容为上图红框圈起部分: IjkMediaPlayer_pr ...

  9. java连接mongodb_java连接mongodb源码解读

    用mongdb也大半年了,一直是业务上的逻辑实现了就ok.然而这样并不能进步--因此今天查了查java连接mongodb驱动的源码,搜到的各种信息整合一下,方便以后深入的使用. 先贴连接数据库代码Li ...

  10. java.util.concurrent.locks.Condition 源码

    2019独角兽企业重金招聘Python工程师标准>>> 相关类图: 使用Condition和 object作为条件队列的区别: object: 只能绑定一个内部队列,使用notify ...

最新文章

  1. Android开源控件ViewPager Indicator的使用方法
  2. SpringMVC框架 学习DAY_02 : 接收请求参数/向模板页面转发数据/重定向与转发 /Session
  3. 计算机科学讨论,第七章计算机科学讨论报告
  4. 由“深”至“广”,探索2022音视频技术的无限可能
  5. 2018.09.19 atcoder AtCoDeer and Election Report(贪心)
  6. arcpy 实现新增字段合并字段
  7. mobi文件怎么转化为PDF
  8. 测试用例设计方法详解
  9. java中分解json数据,java解析JSON数据详解
  10. excel怎么输入度分秒,并转换为可编辑文本格式
  11. 蚂蚁金服刘伟光:我们为什么要科技开放
  12. bc vc投资_天使投资、VC 以及 PE 的区别是什么?
  13. 六度分离_hdu_1869(floyd算法).java
  14. 【背包问题】基于matlab禁忌搜索算法求解背包问题【含Matlab源码 373期】
  15. ORA-01439: 要更改数据类型, 则要修改的列必须为空
  16. 【模电实验】基尔霍夫定律、叠加定理和戴维南定理验证实验
  17. 去哪儿2017校园招聘笔试题——获得文件扩展名filename extension
  18. 2022 GopherChina 想听什么由你做主!
  19. [Usaco2008 Oct]笨重的石子 DP
  20. Geodetic集合

热门文章

  1. 高校舆情分析python_微博的高校舆情监控系统设计
  2. 【夏虫语冰】visio2013安装出错,您输入的产品密钥无法在此计算机上使用,错误25004
  3. OPPO小布助手算法系统的探索、实践与思考
  4. windos不能在本地计算机启动服务器,WDS 服务器可能无法启动 - Windows Server | Microsoft Docs...
  5. 2019年7月Github上最热门的Java开源项目
  6. CISSP 认证的 12 部优秀 CISSP 书籍和学习指南+学习网站
  7. 【分享】“金蝶云星辰“ 在集简云平台集成应用的常见问题与解决方案
  8. 超小型射频接头SMP/SSMP
  9. 金万维异速联服务器重装,金万维异速联服务器配置说明
  10. 无法读源文件或磁盘怎么办?