当前位置:首页 » 操作系统 » jdknative源码

jdknative源码

发布时间: 2023-05-19 23:06:34

A. java中关于native使用错误的是

无源文件。必须加上文件岁培后缀名.java,否则将提示以下信息:D:Native>javac-h.HelloNative错误:仅当显式请求注释处理时才接受类名称。源代码,native是用做java和其他语言(如C++)进行协作时使用,也就是native后乎纤唯的函数的实现不是用java写的。竖隐

B. 如何查看java源码中的native方法源码

下载JDK源代码啊,openJDK上有完整的JDK源代码,JDK源代码由C++、Java、念岁C、汇编 这四种语言组成。JVM主体并游是C++写的,JNI部分是C,工具类是Java写的,JVM里混有汇编代码。路径:openjdk-7-fcs-src-b147\jdk\src\share\native\java\仔蔽睁lang\System.c 找到这个
/* Only register the performance-critical methods */
static JNINativeMethod methods[] = {
{"currentTimeMillis", "()J", (void *)&JVM_CurrentTimeMillis},
{"nanoTime", "()J", (void *)&JVM_NanoTime},
{"array", "(" OBJ "I" OBJ "II)V", (void *)&JVM_ArrayCopy},
};

方法的实现应该在JVM部分,路径openjdk-7-fcs-src-b147\hotspot\src\share,不同的操作系统实现不一样,应该是在对应的操作系统的包下

C. java程序 求抓包程序源代码!!

package com.daidai.util;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

public class HibernateUtil {
private static SessionFactory sessionFactory;

public static SessionFactory getSessionFactory() {
Configuration conf=new Configuration().configure();
sessionFactory=conf.buildSessionFactory();
return sessionFactory;
}

public static void setSessionFactory(SessionFactory sessionFactory) {
HibernateUtil.sessionFactory = sessionFactory;
}
public static Session getSession(){
return sessionFactory.openSession();
}

}

package com.daidai.util;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;

import jxl.Cell;
import jxl.Sheet;
import jxl.Workbook;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;

public class Util {
private static String Cellphone_Number;
private static String Cellphone_Number1;
private static String Cellphone_Number2;
private static String Fasten_Telephone;
private static String Fasten_Telephone2;
private static String name;
private static String remarks;
public static Sheet rs;
public Util(){}
static{
try{
Workbook rwb=Workbook.getWorkbook(new File("Book1.xls"));
rs=rwb.getSheet(0);
int count=rs.getColumns();
System.out.println(count);
int count1=rs.getRows();
System.out.println(count1);
//获取第一行,第一列的值
//count1行
//count列
for(int i=0;i<count1;i++){
for(int j=0;j<count;j++){
Cell c00 = rs.getCell(j, i);
String strc00 = c00.getContents();
//获取第一行,第二列的值
Cell c10 = rs.getCell(1, 0);
String strc10 = c10.getContents();
System.out.println(strc00);
System.out.println(strc10);
}
}
}catch(Exception e){
e.printStackTrace();
}
}
public static void main(String[]args){
Util u=new Util();

}
}

<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="connection.driver_class"
>com.mysql.jdbc.Driver</property>
<property name="connection.url"
>jdbc:mysql://127.0.0.1:3306/test</property>
<property name="connection.username"
>root</property>
<property name="connection.password"
>daidai</property>

<!-- SQL dialect 数据库方言-->
<property name="dialect"
>org.hibernate.dialect.MySQLDialect</property>

<!-- Echo all executed SQL to stdout -->
<property name="show_sql">true</property>
<property name="hbm2ddl.auto">create</property>
<mapping resource="User.hbm.xml"/>
</session-factory>
</hibernate-configuration>

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.daidai.entity">
<class name="User" table="t_user">
<id name="id">
<generator class="native"/>
</id>
<property name="name" type="java.lang.String" length="15"/>
<property name="Cellphone_Number" type="java.lang.String" length="11"/>
<property name="Cellphone_Number1" type="java.lang.String" length="11"/>
<property name="Cellphone_Number2" type="java.lang.String" length="11"/>
<property name="Fasten_Telephone" type="java.lang.String" length="11"/>
<property name="Fasten_Telephone2" type="java.lang.String" length="11"/>
<property name="remarks" type="java.lang.String"/>
</class>
</hibernate-mapping>

package com.daidai..impl;
import com.daidai.util.*;

import org.hibernate.HibernateException;
import org.hibernate.Session;

import com.daidai..UserDAO;
import com.daidai.entity.User;

public class UserDAOImpl implements UserDAO {
public Session session=null;
public void save(User user) {
try {
session=HibernateUtil.getSession();
session.getTransaction().begin();
session.save(user);
session.getTransaction().commit();
} catch (HibernateException e) {
session.getTransaction().rollback();
e.printStackTrace();
throw e;
}
}

}

package com.daidai.;

import com.daidai.entity.User;

public interface UserDAO {
public void save(User user);
}

D. 什么是native输出

JAVA中的native是什么?

native主要用于方法上

1、一个native方法就是一个Java调用非Java代码的接口。一个native方法是指该方法的实现由非Java语言实现,比如用C或C++实现。
2、在定义一个native方法时,并不提供实现体(比较像定义一个Java Interface),因为其实现体是由非Java语言在外面实现的。

native关键字说明其修饰的方法是一个原生态方法,方法对应的实现不是在当前文件,而是在用其他语言(如C和C++)实现的文件中。Java语言本身不能对李乎操作系统底层进行访问和操作,但是可以通过JNI接口调用闭伍其他语哪态悉言来实现对底层的访问。

JNI是Java本机接口(Java Native Interface),是一个本机编程接口,它是Java软件开发工具箱(Java Software Development Kit,SDK)的一部分。JNI允许Java代码使用以其他语言编写的代码和代码库。Invocation API(JNI的一部分)可以用来将Java虚拟机(JVM)嵌入到本机应用程序中,从而允许程序员从本机代码内部调用Java代码。

不过,对Java外部的调用通常不能移植到其他平台,在applet中还可能引发安全异常。实现本地代码将使您的Java应用程序无法通过100%纯Java测试。但是,如果必须执行本地调用,则要考虑几个准则:

1.将您的所有本地方法都封装到一个类中,这个类调用单个的DLL。对每一种目标操作系统平台,都可以用特定于适当平台的版本的DLL。这样可以将本地代码的影响减少到最小,并有助于将以后所需要的移植问题考虑在内。

2.本地方法尽量简单。尽量使您的本地方法对第三方(包括Microsoft)运行时DLL的依赖减少到最小。使您的本地方法尽量独立,以将加载您的DLL和应用程序所需的开销减少到最小。如果需要运行时DLL,必须随应用程序一起提供。

JNI的书写步骤如下:

a.编写带有native声明的方法的Java类

b.使用javac命令编译编写的Java类

c.使用java -jni ****来生成后缀名为.h的头文件

d.使用其他语言(C、C++)实现本地方法

e.将本地方法编写的文件生成动态链接库

以下是一个在Java中调用本地C程序的简单的例子:

a.编写HelloWorld.java类

class HelloWorld {
public native void hello();
static {
System.loadLibrary("hello");
}
public static void main(String[] args) {
new HelloWorld().hello();
}
}

b.编译

javac HelloWorld.java

c.生成.h文件

javah -jni HelloWorld

生成内容如下:

/* DO NOT EDIT THIS FILE - it is machine generated */ #
include <jni.h>
/* Header for class HelloWorld */
#ifndef _Included_HelloWorld
#define _Included_HelloWorld
#ifdef __cplusplus
extern "C" {#
endif
/*
* Class: HelloWorld
* Method: hello
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_HelloWorld_hello(JNIEnv * , jobject);#
ifdef __cplusplus
}#
endif# endif

第一个参数是调用JNI方法时使用的JNI Environment指针。第二个参数是指向在此Java代码中实例化的Java对象HelloWorld的一个句柄。其他参数是方法本身的参数

d.c实现

#include < jni.h >
#include "HelloWorld.h"
#include < stdio.h >
JNIEXPORT void JNICALL Java_HelloWorld_hello(JNIEnv * env, jobject obj) {
printf("Hello World!\n");
return;
}

其中,第一行是将jni.h文件引入(在%JAVA_HOME%\include目录下),里边有JNIEnv和jobject的定义。

e.编译c实现

这里以在Windows中为例,需要生成dll文件。在保存HelloWorldImpl.c文件夹下面,使用VC的编译器cl成。

cl -I%java_home%\include -I%java_home%\include\win32 -LD HelloWorldImp.c -Fehello.dll

注意:生成的dll文件名在选项-Fe后面配置,这里是hello,因为在HelloWorld.java文件中我们loadLibary的时候使用的名字是hello。当然这里修改之后那里也需要修改。另外需要将-I%java_home%\include -I%java_home%\include\win32参数加上,因为在第四步里面编写本地方法的时候引入了jni.h文件。

6) 运行程序

java HelloWorld 就ok了!
文章知识点与官方知识档案匹配
Java技能树首页概览
91537 人正在系统学习中
打开CSDN APP,看更多技术内容

Java当中native方法的详解_先苦后甜似淡非定的博客_native方法...
一、认识 native 即 JNI,Java Native Interface 凡是一种语言,都希望是纯。比如解决某一个方案都喜欢就单单这个语言来写即可。Java平台有个用户和本地C代码进行互操作的API,称为Java Native Interface (Java本地接口)。 回到顶部 二...
继续访问
JAVA中的native是什么有什么用_Rsun04551的博客_java中native...
1、一个native方法就是一个Java调用非Java代码的接口。一个native方法是指该方法的实现由非Java语言实现,比如用C或C++实现 2、在定义一个native方法时,并不提供实现体(比较像定义一个Java Interface),因为其实现体是由非Java语言在外面...
继续访问
【基础】Java的native方法作用和意义
Java的native方法作用和意义
继续访问
最新发布 Java关键字之native详解
native 用来修饰方法,用 native 声明的方法表示告知 JVM 调用,该方法在外部定义,我们可以用任何语言去实现它。简单地讲,一个native Method就是一个 Java 调用非 Java 代码的接口。
继续访问

java之native关键字详细解析_码农研究僧的博客
publicnativeStringintern(); 1 1. 概念 深究其native这个关键字 其主要表现为 只要有一个native方法,内部结构是Java调用非Java代码接口 所谓的非java代码,主要是指c或者c++实现,可以不深究其代码实现,只需要会调用即可 ...
继续访问
java中的Native方法_消逝者的博客_java native方法
一. 什么是Native Method 简单地讲,一个Native Method就是一个java调用非java代码的接口。一个Native Method是这样一个java的方法:该方法的实现由非java语言实现,比如C。这个特征并非java所特有,很多其它的编程语言都有这一机制,比如在...
继续访问
Java中的native方法
原文链接:java中的native方法 Java不是完美的,Java的不足除了体现在运行速度上要比传统的C++慢许多之外,Java无法直接访问到操作系统底层(如系统硬件等),为此Java使用native方法来扩展Java程序的功能。 可以将native方法比作Java程序同C程序的接口,其实现步骤: 1、在Java中声明native()方法,然后编译。 2、用javah产生一个
继续访问
JNI使用及简单封装
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录前言一、Java调用C++二、使用步骤1.引入库2.读入数据总结 前言 提示:这里可以添加本文要记录的大概内容: 本文主要记录JNI实践中的使用场景,Java调用C++ ,C++回调Java的实现过程,带简单封装思路。 提示:以下是本篇文章正文内容,下面案例可供参考 一、Java调用C++ ##1, 示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。 二、使用步骤 1.引入库 代码如下(示.
继续访问

java中native方法实现_详解Java中native方法的使用_勤婧知浩的博客-C...
今天在网上学习时碰到有关于native修饰符所修饰的方法,上网查了查,觉得很有意思记录一下 1、native简介 简单地讲,一个Native Method就是一个java调用非java代码的接口。一个Native Method是这样一个java的方法:该方法的实现由非java语言...
继续访问
java native方法_深入理解Java虚拟机_weixin_39557087的博客-CSDN...
native方法就是非Java的方法,比如可能是C 实现的,在字节码文件中并不会体现,所以native方法的计数器值是空的。比如System.currentTimeMillis();方法就是一个native方法,声明如下: (); ...
继续访问
java的native_Java关键字(二)——native
本篇博客我们将介绍Java中的一个关键字——native。native 关键字在 JDK 源码中很多类中都有,在 Object.java类中,其 getClass() 方法、hashCode()方法、clone() 方法等等都是用 native 关键字修饰的。public final native Class> getClass();public native int hashCode();...
继续访问
Java native方法详解
一. 什么是Native Method 简单地讲,一个Native Method就是一个java调用非java代码的接口。一个Native Method是这样一个java的方法:该方法的实现由非java语言实现,比如C。这个特征并非java所特有,很多其它的编程语言都有这一机制,比如在C++中,你可以用extern "C"告知C++编译器去调用一个C的函数。 "A native method
继续访问
java中的native是什么
native主要用于方法上 一个native方法就是一个Java调用非Java代码的接口。一个native方法是指该方法的实现由非Java语言实现,比如用C或C++实现。

E. 原来jdk自带了这么好玩的工具——使用 jstack定位死循环

线程快照是java虚拟机内每一个线程正在执行的方法堆栈的集合,生成线程快照的主要目的是用于定位线程出现问题的位置;常见的问题有

命令格式

jstack的option参数并不多,真正用到的也就三个,接下来我们一个个介绍一下

- -F :当线程挂起(Suspended)时,使用jstack -l pid命令是不会打印堆栈信息的,使用-F则可以强制输出线程堆栈;但是会停止但
- -l :打印的信息除了堆栈外,还会显示锁芹梁返的附加信息;
- -m :同时输出java和C/C++的堆栈信息;在java的系统类库里面,有很多方法都是native修饰的,这些native修饰的方法你在java层面是看不到源码的,因为这些方法都是C/C++实现嫌饥的;

在线程的堆栈中,需要特别留意以下几种状态:

不带option参数的命令

打印结果如下

第一行各个单词的解析,

这里我们使用2个窗口,分别使用以下2个命令来测试

通过2个窗口对比可以看到,加了-l的命令多打印了锁的信息;

一般情况下,如果程序出错了, 都不会直接在生产环境的服务器上找错误,这个时候就可以用到一个非常实用的功能,将堆栈快照导出来,然后到别的电脑上看,命令如下

执行后,就可以看到文件已经导出来了

通过cat命令可以看到,里面的内容和我们在命令行输出的内容是一样的

首先我们准备好一个死循环的线程,在线程内定一个while的死循环,并且给这个线程起个名字为:yexindogn,阿里巴巴的开发规范里面有一个规定,就是每个线程必须起一个名字,起名字就是为了 以后程序出问题的时候好找错误;

接着我们将此代码打成jar包扔到linux服务器上运行,直接输入 java -jar Test.jar 命令即可运行,运行后我们可以看到控制台一直在输出112这个字符,这就代表程序已经在运行了;

接着在看下CPU的运行情况,使用top命令查看cpu占用情况,排在第一位的是进程号为30328的进程,占用了6.6%的cpu; 这边我使用了2个命令行连到同一台服务器,一个窗口用来运行刚刚的jar包,另一个窗口用来查找错误;

知道进程号了,接着就是找线程了,输入以下命令

打印结果如下,这里有一点需要注意,在我们加上-Hp指令后,PID展示就是线程的id了,这时候我们看到占用CPU最高的线程id是30365;

还有另一种方式,就是使用ps命令来查找线程

通过这个命令我们可以看到这边占用最高的线程id也是30365 ;

以上的方式我们成功找到了占用cpu高的线程id是30365,但这个id是十进制的,在这里需要先转为16进制,输入命令

计算出对应的16进制为:769d

当然也可以用其他的计算工具,比如mac系统自带计算器就支持进制之间的转换

在命令行输入以下命令,这种方法更加快速,推荐使用

其中,grep 命令是查找结果为769d的内容,-A 20 表示打印匹配所在行的后20行内容。直接帮我们定位到所在线程的堆栈,结果如下

当然也可以用下面的死办法,先打印出所有的堆栈快照;

打印结果如下

接着我用刚刚计算出来的16进制复制出来在这里搜索一下,经过查看就知道是我们刚刚起了名字为yexindong的线程出错了,出错的位置在Test.java的第13行代码

我们看看java代码,确实是第13行这里的死循环导致的

首先打开任务管理器,因为默认windows的任务管理器是不显示进程pid的,所以我们需要设置一下,选择 查看 选择列(S)...

选中PID进程表示符后点击确定按钮

然后我们就可以看到占用CPU最高的java进程PID为:976

因为windows不能直接查看java进程中的线程信息,所以我们需要借助一个工具,渣指这个工具是微软自己开发的,叫做Process Explorer ,网上很多,需要的童鞋请自行网络,打开后找到pid为976的进程右击选择 属性

在弹出的窗口中找到线程这一栏,它的排序默认就是按照cpu占用的率倒序排列的,所以最上面的就是占用cpu最高的线程了,记住它的线程id:3548

刚刚拿到的进程id是十进制的,但是我们导出的jstack信息里面,线程id是以16进制来展示的,所以我们要先将这个线程id为3548转为16进制的,使用windows自带的计算器即可,在快捷命令行输入calc

计算器打开后将其设置为程序员使用的计算器

接着输入线程id3548,在按一下16进制,就会自动进行转换,结果为ddc,记住这个16进制;

在命令行输入以下指令导出进程的堆栈快照信息

几秒钟后,快照导出了,静静地躺在文件夹里,等待着我们打开

用Notepad++打开导出的文件,搜索刚刚计算出来的16进制ddc,就可以定位到线程出错的位置了

有些童鞋可能会觉得用这个jstack命令麻烦了,那java在代码里面可不可以打印出堆栈呢?你别说,还真有,就是这个方法:Thread.getAllStackTraces();光说不练假把式,来个demo测试一下吧

执行后打印结果如下,由此可以看到,将当前进程的所有线程都打印出来了,但是这边只打印了简单的堆栈信息,对于开发人员来说,已经起到了监控作用;

作为调优和找错的工具来说,可以说jstack是用的最多的一个工具了,但是由于局限性,现在已经慢慢被替换掉了;大家更倾向于使用阿里巴巴开发的工具arthas;感兴趣的童鞋可以了解下!

F. 如何在Android源码里查找Java中native方法对应的C++实现

知道方法名就知道C++里的函咐历拍衡羡数名了,native方法的函数名是
Java_包名_类名_函数名
开头的,包名要把.换成_。比如com.xxx.yyy.ClassA.methodB在C++那边找Java_com_xxx_yyy_ClassA_methodB就行烂昌了

G. jdk的配置

JDK 安装

Java实际上分为三个版本:

  • J2ME:Java 2 Micro Edition,适用于移动端的微型版本,曾广泛应用于机顶盒、车载系统、移动数字电话、个人数字助理(PDA)以及一系列嵌入式设备中,和大家接触最多的便是前几年的手机上搭载的J2SE环境,它几乎支撑了智能手机游戏的半边天。

  • J2SE:Java 2 Standrad Edition,Java标准版本,只包含基础的Java类库,适用于在桌面端构建Java程序。它是J2ME和J2EE的基础。

  • J2EE:Java 2 Enterprise Edition,Java企业版本,包含很多企业级特性,适用于简化企业开发的版本,包含一系列特性,如EJB、JAXB、JDBC API、CORBA、Servlet、JSP等等,实际上我们今天使用的JDK名义上是J2SE,但实际上他已经混入了J2EE的很多特性,算得上是J2EE版本了。

  • PS:Java在1.2版本之后统称为Java 2。当然,在当下“Java”这种叫法已经是熟路的叫法了。

    我们在开发中一般安装的是J2SE,若需要J2EE的一些特性我们一般是通过Maven去关联支持类库的。

    JRE和JDK的区别

    JRE是Java运行环境,只包含了Java程序运行时所需要的一系列类库(Binary),他可以被精简至更小。JDK则是Java开发包,除了包含一整套JRE还包含有一些列为开发者提供的工具(命令行工具和GUI工具)用于管理Java程序(jjs、jmc、jps、jvisualvm、jstatck、jhat、jdoc等等一系列工具),还包含大部分内置类库的源码(包括Native方法的源码)。

    开始安装

    1、下载安装包

  • 在Oracle官网https://www.oracle.com/technetwork/java/javase/downloads/index.html找到你想要下载的安装包,由于2019年后java会开始收费,故我们只能使用java8 固定版本。详细参见00.关于Java开始收费的说明,因此我们只选择jdk1.8.0_181.rar之前的版本,并且只选择小版本号为奇数(如8u191)的安装包。

  • 离线window x64的JDK压缩

  • 2、安装

    linux和windows都可以下载安装版和压缩包,安装过程略过。个人推荐压缩包,下载后解压即可。

    3、配置环境变量

  • Windows
    在Windows上需要配置的环境变量为JAVA_HOME、Path和Classpath(Classpath在Java1.5之后可以不设置)
    JAVA_HOME: 全路径,指向你的JDK目录,注意,一定是jdkXXX这种目录
    Path: .;%JAVA_HOME%libdt.jar;%JAVA_HOME%lib ools.jar;%JAVA_HOME%in; (不要忘了前面的小点)

  • Linux

    在Linux下配置环境变量需要注意,你需要根据你的实际情况选择是配置全局的环境变量还是该用户下的环境变量。全局环境变量请修改/etc/propfile,用户环境变量请修改~/.bash_profile

    在上述文件末尾加入:

    export JAVA_HOME=/usr/opt/java/jdkXXX
    export PATH=$JAVA_HOME/bin:$PATH
    export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

    保存后执行source <你刚刚修改的文件>

  • 至此,配置完毕,请打开控制台输入javac命令验证。若出现响应则说明配置成功,若出现“不能识别的指令”则说明配置失败,请按照上文修改。

H. 如何在Android源码里查找Java中native方法对应的C++实现

如何在Android源码里查找Java中native方法对应的C++实现

在framework下全局搜索这个native方法的全名。一个个查看匹配的文件,应该会找到你需要的。一般命名都有规律,大部分jni方法都在 frameworksasecorejni目录

在Android源码里,有许多方法都是使用Jni机制调用底层的C++实现,比如大家都很熟悉的Binder.java里,就有 public static final native int getCallingPid(); public static final native int getCallingUid(); public static final native long clearCallingIdentity(); 等方法都是直接调用C++里的实现。 通过下面命令可以拦雀陆很快找到对应的实现, . build/envsetup cgrep ./frameworks '"getCallingPid"' 这时会查找到如下结果: 这样就可以知道对应的C++实现方法名字为android_os_Binder_getCallingPid, 在该文件中找这个方法的实现即可。

android源码只包含android app java的客户端代码。
native部分可能有可能没有,先全局搜索.c或者.cpp文件,有这些文件才可能有。
如果是标准的android native support 工程,那么eclipse里面打开之后,在工程目录/jni下面就是 native的C++代码。

比如有方法aaa.bbb.CCC.ddd,JNI对应的名字就是Java_aaa_bbb_CCC_ddd,地图炮搜索就是了,注意不要用全字简顷段匹配,因为JNI名可能还带参数后缀。

另外你的确定你是下的整套Android系统的源码,不是SDK附带的那个源码,那个只有Java的而且还不全。

android源码只包含android app java的客户端代码。
native部分可能有可能没有,先全局搜索.c或者.cpp文件,有这些文件才可能有。
如果是标准的android native support 工程,那么eclipse里面打开之后,在工程目录/jni下面就是 native的C++代码。
Android源码中很多关键代码都是C++实现的,java通过jni来调用,经常会看到java中这样的代码:
static native Thread currentThread();
如何根据方法名找到其对应的C++实现,有两个方法。
先来个java代码的示例VMThread.java:
package java.lang;
class VMThread {
Thread thread;
int vmData;
VMThread(Thread t) {
thread = t;
}
native static void create(Thread t, long stackSize);
static native Thread currentThread();
static native boolean interrupted();
static native void sleep (long msec, int nsec) throws InterruptedException;
static native void yield();
native void interrupt();
native boolean isInterrupted();
......
}
我们要查找currentThread方法的实现。
方法一:
由于Android源码中对每个native实现都会写一个java方法名和C++方法名映射的列表,所以我们直接搜索这个列表内容即可。
zkw@zkw $ grep -rns '"currentThread"' ./*
./art/piler/dex/quick/dex_file_method_inliner.:108: "currentThread", kNameCacheCurrentThread
匹配岁枯到二进制文件 ./dalvik/vm/native/.java_lang_VMThread.cpp.swp
./dalvik/vm/native/java_lang_VMThread.cpp:241: { "currentThread", "()Ljava/lang/Thread;",
./external/android-mock/testsgoogle/android/testing/mocking/AndroidMockGeneratorTest.java:249: Method method = Thread.class.getMethod("currentThread");
./external/android-mock/testsgoogle/android/testing/mocking/AndroidMockGeneratorTest.java:407: Method method = Thread.class.getMethod("currentThread");
可以看到,在文件./dalvik/vm/native/java_lang_VMThread.cpp中找到currentThread方法相关的信息,后面()Ljava/lang/Thread代表这个方法的返回值。
进入java_lang_VMThread.cpp这个文件可以看到:
17 /*
18 * java.lang.VMThread
19 */
20 #include "Dalvik.h"
21 #include "native/InternalNativePriv.h"
22
23
24 /*
25 * static void create(Thread t, long stacksize)
26 *
27 * This is eventually called as a result of Thread.start().
28 *
29 * Throws an exception on failure.
30 */
31 static void Dalvik_java_lang_VMThread_create(const u4* args, JValue* pResult)
32 {
33 Object* threadObj = (Object*) args[0];
34 s8 stackSize = GET_ARG_LONG(args, 1);
35
36 /* ing collector will pin threadObj for us since it was an argument */
37 dvmCreateInterpThread(threadObj, (int) stackSize);
38 RETURN_VOID();
39 }
40
41 /*
42 * static Thread currentThread()
43 */
44 static void Dalvik_java_lang_VMThread_currentThread(const u4* args,
45 JValue* pResult)
46 {
47 UNUSED_PARAMETER(args);
48
49 RETURN_PTR(dvmThreadSelf()->threadObj);
50 }
51
......
237
238 const DalvikNativeMethod dvm_java_lang_VMThread[] = {
239 { "create", "(Ljava/lang/Thread;J)V",
240 Dalvik_java_lang_VMThread_create },
241 { "currentThread", "()Ljava/lang/Thread;",
242 Dalvik_java_lang_VMThread_currentThread },
243 { "getStatus", "()I",
244 Dalvik_java_lang_VMThread_getStatus },
245 { "holdsLock", "(Ljava/lang/Object;)Z",
246 Dalvik_java_lang_VMThread_holdsLock },
247 { "interrupt", "()V",
248 Dalvik_java_lang_VMThread_interrupt },
249 { "interrupted", "()Z",
250 Dalvik_java_lang_VMThread_interrupted },
251 { "isInterrupted", "()Z",
252 Dalvik_java_lang_VMThread_isInterrupted },
253 { "nameChanged", "(Ljava/lang/String;)V",
254 Dalvik_java_lang_VMThread_nameChanged },
255 { "setPriority", "(I)V",
256 Dalvik_java_lang_VMThread_setPriority },
257 { "sleep", "(JI)V",
258 Dalvik_java_lang_VMThread_sleep },
259 { "yield", "()V",
260 Dalvik_java_lang_VMThread_yield },
261 { NULL, NULL, NULL },
262 };
源码中第242行找到对应的名字,用红色标出,其实现就在第44行。
这个方法不是很准确,要靠经验来判断搜出来的代码是否是自己要找的,下一个方法可以较准确的查找。
方法二:
还是找VMThread.java的currentThread函数,找多了会发现,C++的名字一般都是包名+类名+方法名,比如currentThread的C++名字就肯定包含“java_lang_VMThread_currentThread”,所以直接搜索即可。
如何在Android源码里查找Java中native方法对应的C++参考::e.51cto./course/course_id-4377.

知道方法名就知道C++里的函数名了,native方法的函数名是 Java_包名_类名_函数名 开头的,包名要把.换成_。比如.xxx.yyy.ClassA.methodB在C++那边找Java__xxx_yyy_ClassA_methodB就行了

如何在eclipse中查看android源码

假设我们想参看Activity类的源代码,按着Ctrl键,左击它,现实的结果却看不到代码的,提示的信息便是“找不到Activity.class文件”。
此时点击下面的按钮,“Change Attached Source…”,选择android源代码所在位置,便弹出对话框。
第一种是选择工作目录,即已经存在的android应用程序源代码。
第二种分两种方式
(1)选择External File…按钮,添加Jar格式文件或者zip格式文件路径;
(2)选择External Floder…按钮,添加文件夹所在路径。
下面问题就来了,源代码在哪里?不能凭空产生阿。
可以通过Android SDK Manager进行源代码下载;(推荐该种方法),勾选Source for Android SDK,进行下载即可。
此外也可通过其他途径下载,网上有很多共享的资源。
这里选择第二种方式的(2)方法,选择源码所在目录(即下载源代码目录所在路径)
点击“OK”按钮,此时,Activity文件便能够查看源代码了

I. 谁知道,在java里,object提供的hashcode是如何计算的,我看源代码是native类型

Java对于eqauls方法和hashCode方法是这样规定的:

1、如果两个对象相同,那么它们的hashCode值一定要相同;

2、如果两个对象的hashCode相同,它们并不一定相同 上面说的对象相同指的是用eqauls方法比较。 你当然可以不按要求去做了,但你会发现,相同的对象可以出现在Set集合中。同时,增加新元素的效率会大大下降。

如果你改写了equal()方法,令两个实际不是一个对象的两个实例在逻辑上相等了,但是hashcode却是不等。

所以要记得改写hashcode。

不改写会带来什么后果呢?当然,比如你在用hashmap,hashtable之类的设计hashcode的类的时候,就会出麻烦了。

至于如何改写一个hashcode,这就有好有坏了,看各人的功底了。现在还有专门的人在研究优秀的hash算法

也就是说 List 是一个有序的、可重复的对象容器接口,Set是一个无序的、不可重复的对象容器接口 。后面都讲了 Set 是如何实现不重复的 :为了避免多次重复的使用 equal 方法带来的系统负担 ,set 首先调用hashCode 方法来检测 是否被占用 如果被占用 然后调用 equal 方法判断被占用的是否相同

J. 在哪里可以看到JAVA的object类中clone方法的源代码

看不到的,是C代码。听说Java开源了,你倒是可以去官网上看看。

调用中实现clonable接口并给出方法。

public class Example implements Clonable {

int valueToClone;

public Object clone() {
Object o = super.clone();
(Example) o).valueToClone = valueToClone;

return o;
}
}

另外参见API. 有的书建议不采用Clonable,因为非常难实现一个完美的Clone 链,且方法本身返回Object需要cast,并不美观。可以自己写一个接口代替。

热点内容
电子产品存储要求 发布:2025-04-23 07:58:30 浏览:214
imac存储硬盘位置 发布:2025-04-23 07:55:18 浏览:327
sql远程连接端口 发布:2025-04-23 07:55:16 浏览:782
vmos脚本不生效 发布:2025-04-23 07:48:25 浏览:991
奔驰怎么连接安卓的手机 发布:2025-04-23 07:39:54 浏览:594
ipad怎么设置长密码 发布:2025-04-23 07:39:54 浏览:573
冷媒压缩机 发布:2025-04-23 07:39:53 浏览:223
php1970 发布:2025-04-23 07:30:36 浏览:853
c语言中e的表示 发布:2025-04-23 07:12:25 浏览:810
活跃度算法 发布:2025-04-23 07:10:41 浏览:110