導航:首頁 > 源碼編譯 > javanative方法源碼

javanative方法源碼

發布時間:2023-02-23 18:42:35

1. 什麼是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++實現。

2. 怎樣理解java native方法

什麼是Native Method
簡單地講,一個Native Method就是一個java調用非java代碼的介面。一個Native Method是這樣一個java的方法:該方法的實現由非java語言實現,比如C。這個特徵並非java所特有,很多其它的編程語言都有這一機制,比如在C++中,你可以用extern "C"告知C++編譯器去調用一個C的函數。
"A native method is a Java method whose implementation is provided by non-java code."
在定義一個native method時,並不提供實現體(有些像定義一個java interface),因為其實現體是由非java語言在外面實現的。,下面給了一個示例:
public class IHaveNatives
{
native public void Native1( int x ) ;
native static public long Native2() ;
native synchronized private float Native3( Object o ) ;
native void Native4( int[] ary ) throws Exception ;
}
這些方法的聲明描述了一些非java代碼在這些java代碼里看起來像什麼樣子(view).
標識符native可以與所有其它的java標識符連用,但是abstract除外。這是合理的,因為native暗示這些方法是有實現體的,只不過這些實現體是非java的,但是abstract卻顯然的指明這些方法無實現體。native與其它java標識符連用時,其意義同非Native Method並無差別,比如native static表明這個方法可以在不產生類的實例時直接調用,這非常方便,比如當你想用一個native method去調用一個C的類庫時。上面的第三個方法用到了native synchronized,JVM在進入這個方法的實現體之前會執行同步鎖機制(就像java的多線程。)
一個native method方法可以返回任何java類型,包括非基本類型,而且同樣可以進行異常控制。這些方法的實現體可以制一個異常並且將其拋出,這一點與java的方法非常相似。當一個native method接收到一些非基本類型時如Object或一個整型數組時,這個方法可以訪問這非些基本型的內部,但是這將使這個native方法依賴於你所訪問的java類的實現。有一點要牢牢記住:我們可以在一個native method的本地實現中訪問所有的java特性,但是這要依賴於你所訪問的java特性的實現,而且這樣做遠遠不如在java語言中使用那些特性方便和容易。
native method的存在並不會對其他類調用這些本地方法產生任何影響,實際上調用這些方法的其他類甚至不知道它所調用的是一個本地方法。JVM將控制調用本地方法的所有細節。需要注意當我們將一個本地方法聲明為final的情況。用java實現的方法體在被編譯時可能會因為內聯而產生效率上的提升。但是一個native final方法是否也能獲得這樣的好處卻是值得懷疑的,但是這只是一個代碼優化方面的問題,對功能實現沒有影響。
如果一個含有本地方法的類被繼承,子類會繼承這個本地方法並且可以用java語言重寫這個方法(這個似乎看起來有些奇怪),同樣的如果一個本地方法被fianl標識,它被繼承後不能被重寫。
本地方法非常有用,因為它有效地擴充了jvm.事實上,我們所寫的java代碼已經用到了本地方法,在sun的java的並發(多線程)的機制實現中,許多與操作系統的接觸點都用到了本地方法,這使得java程序能夠超越java運行時的界限。有了本地方法,java程序可以做任何應用層次的任務。

3. 如何查看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,不同的操作系統實現不一樣,應該是在對應的操作系統的包下

4. java JDK源碼 native方法 怎樣查看native方法具體實現過程。。

native方法是沒有提供源碼的。
Java中要做到跨平台處理,肯定是要和本地的硬體聯系,這個方法的作用就是與硬體層面結合,所以不同的平台的話,native執行都不一樣。

5. 如何在android源碼里查找Java中native方法對應的C++實現

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/compiler/dex/quick/dex_file_method_inliner.cc: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/tests/com/google/android/testing/mocking/AndroidMockGeneratorTest.java:249: Method method = Thread.class.getMethod("currentThread");
./external/android-mock/tests/com/google/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++參考:http://e.51cto.com/course/course_id-4377.html

6. 如何在Android源碼里查找Java中native方法對應的C++實現

知道方法名就知道C++里的函數名了,native方法的函數名是
Java_包名_類名_函數名
開頭的,包名要把.換成_。比如com.xxx.yyy.ClassA.methodB在C++那邊找Java_com_xxx_yyy_ClassA_methodB就行了

7. java中native的用法

Java不是完美的,Java的不足除了體現在運行速度上要比傳統的C++慢許多之外,Java無法直接訪問到操作系統底層(如系統硬體等),為此Java使用native方法來擴展Java程序的功能。
可以將native方法比作Java程序同C程序的介面,其實現步驟:
1、在Java中聲明native()方法,然後編譯。
2、用javah產生一個.h文件。
3、寫一個.cpp文件實現native導出方法,其中需要包含第二步產生的.h文件(注意其中又包含了JDK帶的jni.h文件)。
4、將第三步的.cpp文件編譯成動態鏈接庫文件。
5、在Java中用System.loadLibrary()方法載入第四步產生的動態鏈接庫文件,這個native()方法就可以在Java中被訪問了。

JAVA的native方法適用的情況:
1、為了使用底層的主機平台的某個特性,而這個特性不能通過JAVA API訪問。
2、為了訪問一個老的系統或者使用一個已有的庫,而這個系統或這個庫不是用JAVA編寫的。
3、為了加快程序的性能,而將一段時間敏感的代碼作為本地方法實現。

閱讀全文

與javanative方法源碼相關的資料

熱點內容
17年新款寶來壓縮機不跳 瀏覽:105
王者打著為什麼伺服器升級 瀏覽:847
aliyunlinux安裝 瀏覽:981
jdk8分層編譯 瀏覽:453
單片機脈沖計數程序 瀏覽:825
原相機文件夾名 瀏覽:330
淘寶雲伺服器靠什麼賺錢 瀏覽:136
單片機同步通信 瀏覽:259
游戲伺服器如何選 瀏覽:746
和平精英蘋果轉安卓怎麼轉不了 瀏覽:52
偉福單片機實驗箱 瀏覽:157
廣東加密貨幣 瀏覽:218
利用python批量查詢系統 瀏覽:499
什麼app看左右臉 瀏覽:304
台灣小公主s解壓密碼 瀏覽:570
易語言鎖機軟體源碼 瀏覽:158
迅雷下載完成無法解壓 瀏覽:592
硬碟分區命令圖解 瀏覽:449
當前雲伺服器如何關閉 瀏覽:80
mac下python在哪 瀏覽:641