01 如何找到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则是各自操作系统独有的。

---------------------------------------------------------------------------------------------------------------------------------------------------

此处插入两个话题:

第一个openjdk源码下载的问题

方法如下:

第一种方法是:

获取OpenJDK源码大致有两种方式,其中一种是通过Mercurial代码版本管理工具从Repository中直接取得源码http://hg.openjdk.java.net

第二种就是从网站上下载 :

http://jdk7.java.net/source.html(这个地址好像不能用了)还有个就是http://download.java.net/openjdk/jdk7  jdk7后面jdk版本可以自己输比如可以是jdk7 也可以是jdk8。

从网上找到这个地址http://download.java.net/openjdk/jdk7下载openjdk源码不管是jdk8还是jdk7都提示找不到资源,后来找到一个能下载的地址,发现a标签的地址不对头。因此通过查看源代码,下载地址如下:

http://download.java.net/openjdk/jdk7/promoted/b147/openjdk-7-fcs-src-b147-27_jun_2011.zip

输入网址即可对应的下载jdk7的源码包.

第二个问题:openjdk与JDK的区别

使用过LINUX的人都应该知道,在大多数LINUX发行版本里,内置或者通过软件源安装JDK的话,都是安装的OpenJDK。那么跟我们常说的JDK,也就是SUN Jdk有啥区别呢?

OpenJDK是JDK的开放原始码版本,以GPL协议的形式放出。在JDK7的时候,OpenJDK已经成为JDK7的主干开发,Sun JDK7是在OpenJDK7的基础上发布的,其大部分原始码都相同,只有少部分原始码被替换掉。使用JRL(JavaResearch License,Java研究授权协议)发布。至于OpenJDK6则更是有其复杂的一面,首先是OpenJDK6是JDK7的一个分支,并且尽量去除Java SE7的新特性,使其尽量的符合Java6的标准。 

具体区别如下:

授权协议的不同: OpenJDK采用GPL V2协议放出,而JDK则采用JRL放出。两者协议虽然都是开放源代码的,但是在使用上的不同在于GPL V2允许在商业上使用,而JRL只允许个人研究使用。

OpenJDK不包含Deployment(部署)功能: 部署的功能包括:Browser Plugin、Java Web Start、以及Java控制面板,这些功能在OpenJDK中是找不到的。 

OpenJDK源代码不完整: 在采用GPL协议的OpenJDK中,Sun JDK的一部分源代码因为产权的问题无法开放OpenJDK使用,其中最主要的部份就是JMX中的可选元件SNMP部份的代码。因此这些不能开放的源代码将它作成plugin,以供OpenJDK编译时使用,你也可以选择不要使用plugin。而Icedtea则为这些不完整的部分开发了相同功能的源代码(OpenJDK6),促使OpenJDK更加完整。 

部分源代码用开源代码替换: 由于产权的问题,很多产权不是SUN的源代码被替换成一些功能相同的开源代码,比如说字体栅格化引擎,使用Free Type代替。 

OpenJDK只包含最精简的JDK: OpenJDK不包含其他的软件包,比如Rhino Java DB JAXP……,并且可以分离的软件包也都是尽量的分离,但是这大多数都是自由软件,你可以自己下载加入。 

不能使用Java商标: 这个很容易理解,在安装OpenJDK的机器上,输入“java -version”显示的是OpenJDK,但是如果是使用Icedtea补丁的OpenJDK,显示的是java。(未验证) 

总之,在Java体系中,还是有很多不自由的成分,源代码的开发不够彻底,希望Oracle能够让JCP更自由开放一些,这也是所有Java社区所希望的。 

--------------------------------------------------------------------------------------------------------------------------------------------

下面继续

下载完源码之后如图:

假如我们要找java.lang.String类中的public native String intern() 本地方法则可以在share/native/java/lang目录下找到String.c,Java_java_lang_String_intern便是对应的C函数源码。 如下图所示:

猜你喜欢

转载自blog.csdn.net/Burgess_Lee/article/details/82893483
今日推荐