如何找到java对应的c/c++源码
2015-01-11 18:48
489 查看
很多时候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则是各自操作系统独有的。
假如我们要找java.lang.String类中的public native String intern() 本地方法则可以在share/native/java/lang目录下找到String.c,Java_java_lang_String_intern便是对应的C函数源码。
喜欢研究java的同学可以交个朋友,下面是本人的微信号:
如果你使用过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则是各自操作系统独有的。
假如我们要找java.lang.String类中的public native String intern() 本地方法则可以在share/native/java/lang目录下找到String.c,Java_java_lang_String_intern便是对应的C函数源码。
喜欢研究java的同学可以交个朋友,下面是本人的微信号:
相关文章推荐
- 如何找到java对应的c/c++源码
- 如何在Android源码里查找Java中native方法对应的C++实现
- 在Android源码中查找Java代码中native函数对应的C++实现
- 如何找到java对应的c/c++源码
- Android JNI中Java与C++对象如何建立一一对应的关系
- (源码阅读)Spring是如何找到URL请求对应的Controller的。
- 如何用java调用c++编写成的DLL
- java和c++区别并说明他们是如何继承
- 如何有效防止Java程序源码被人偷窥?
- 从C++转到Java 如何把握关键
- 如何安装Java源码到本地
- 在ruby中如何调用c、c++或java的资料
- 如何使用MAP文件找到程序崩溃时源码是哪行异常
- 如何在C/C++中调用Java的方法
- JAVA如何调用C/C++方法
- JAVA里如何调用C/C++的DLL里的函数
- java 中如何遍历hashMap的key所对应的value?
- 从C++转到Java 如何把握关键
- 如何在C/C++中调用Java的方法
- 如何在C/C++中调用Java