01如何到java对应的cc++源码
很多时候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源码下载的问题
⽅法如下:
第⼀种⽅法是:
第⼆种就是从⽹站上下载 :
download.java/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函数源码。 如下图所⽰:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论