當前位置:首頁 » 操作系統 » 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,並不美觀。可以自己寫一個介面代替。

熱點內容
liststringjava 發布:2025-04-23 02:56:18 瀏覽:406
asi源碼 發布:2025-04-23 02:46:45 瀏覽:577
小候編程 發布:2025-04-23 02:46:41 瀏覽:559
網路工程師使用哪些軟體寫腳本 發布:2025-04-23 02:28:43 瀏覽:458
c語言短路現象 發布:2025-04-23 02:23:54 瀏覽:303
可運行腳本怎麼寫 發布:2025-04-23 02:23:09 瀏覽:324
安卓死亡空間怎麼飛行 發布:2025-04-23 02:17:21 瀏覽:545
安卓機怎麼設置語音開機 發布:2025-04-23 02:08:01 瀏覽:485
mysql存儲過程事務控制 發布:2025-04-23 02:02:04 瀏覽:652
伺服器ip承載量 發布:2025-04-23 01:53:37 瀏覽:596