Java關鍵字——native

小說:咨詢網站作者:宗順文更新時間:2019-02-20字數:39862

頓時間。紅毯外被欄桿攔著的觀眾們是一陣喧嘩,諸多人爭先恐后地舉手示意。

1378游戲魚好打么

“爹爹,你問人家這個做什么?”明珠臉羞得通紅,臉上有些掛不住了。
這是李隆基密旨中的最后一句話,李隆基竟是要殺他了,比對付王忠嗣還要兇狠,好歹王忠嗣和皇甫惟明都是在貶黜一年后再秘秘密處決,而對付他李慶安卻連最后的虛偽面具都不要了。

不到最后時刻這個國家都不會輕易放棄這個城市的人,不說這個城市戰略位置重要,單單就是里面的人就是一筆巨大的財富,軍隊,人才什么的都是這些人里面出來的?!眲┱f道。

Java關鍵字——native


  本篇博客我們將介紹Java中的一個關鍵字——native。

  native 關鍵字在 JDK 源碼中很多類中都有,在 Object.java類中,其 getClass() 方法、hashCode()方法、clone() 方法等等都是用 native 關鍵字修飾的。

    public final native Class<?> getClass();
    public native int hashCode();
    protected native Object clone() throws CloneNotSupportedException;

  那么為什么要用 native 來修飾方法,這樣做有什么用?

1、JNI:Java Native Interface

  在介紹 native 之前,我們先了解什么是 JNI。

  一般情況下,我們完全可以使用 Java 語言編寫程序,但某些情況下,Java 可能會不滿足應用程序的需求,或者是不能更好的滿足需求,比如:

 ?、?、標準的 Java 類庫不支持應用程序平臺所需的平臺相關功能。

 ?、?、我們已經用另一種語言編寫了一個類庫,如何用Java代碼調用?

 ?、?、某些運行次數特別多的方法代碼,為了加快性能,我們需要用更接近硬件的語言(比如匯編)編寫。

  上面這三種需求,其實說到底就是如何用 Java 代碼調用不同語言編寫的代碼。那么 JNI 應運而生了。

  從Java 1.1開始,Java Native Interface (JNI)標準就成為java平臺的一部分,它允許Java代碼和其他語言寫的代碼進行交互。JNI一開始是為了本地已編譯語言,尤其是C和C++而設計 的,但是它并不妨礙你使用其他語言,只要調用約定受支持就可以了。使用java與本地已編譯的代碼交互,通常會喪失平臺可移植性。但是,有些情況下這樣做是可以接受的,甚至是必須的,比如,使用一些舊的庫,與硬件、操作系統進行交互,或者為了提高程序的性能。JNI標準至少保證本地代碼能工作在任何Java 虛擬機實現下。

  

  通過 JNI,我們就可以通過 Java 程序(代碼)調用到操作系統相關的技術實現的庫函數,從而與其他技術和系統交互,使用其他技術實現的系統的功能;同時其他技術和系統也可以通過 JNI 提供的相應原生接口開調用 Java 應用系統內部實現的功能。

  在windows系統上,一般可執行的應用程序都是基于 native 的PE結構,windows上的 JVM?也是基于native結構實現的。Java應用體系都是構建于 JVM 之上。

  

  可能有人會問,Java不是跨平臺的嗎?如果用 JNI,那么程序不就將失去跨平臺的優點?確實是這樣的。

  JNI 的缺點:

 ?、?、程序不再跨平臺。要想跨平臺,必須在不同的系統環境下重新編譯本地語言部分。

 ?、?、程序不再是絕對安全的,本地代碼的不當使用可能導致整個程序崩潰。一個通用規則是,你應該讓本地方法集中在少數幾個類當中。這樣就降低了JAVA和C之間的耦合性。

?  目前來講使用 JNI 的缺點相對于優點還是可以接受的,可能后面隨著 Java 的技術發展,我們不在需要 JNI,但是目前 JDK 還是一直提供對 JNI 標準的支持。

3、用C語言編寫程序本地方法

  上面講解了什么是 JNI,那么我們接下來就寫個例子,如何用 Java 代碼調用本地的 C 程序。

  官方文檔如下:https://docs.oracle.com/javase/8/docs/technotes/guides/jni/spec/jniTOC.html

  步驟如下:

 ?、?、編寫帶有 native 聲明的方法的java類,生成.java文件;(注意這里出現了 native 聲明的方法關鍵字)

 ?、?、使用 javac 命令編譯所編寫的java類,生成.class文件;

 ?、?、使用 javah -jni? java類名 生成擴展名為 h 的頭文件,也即生成.h文件;

 ?、?、使用C/C++(或者其他編程想語言)實現本地方法,創建.h文件的實現,也就是創建.cpp文件實現.h文件中的方法;

 ?、?、將C/C++編寫的文件生成動態連接庫,生成dll文件;

  下面我們通過一個 HelloWorld 程序的調用來完成這幾個步驟。

  注意:下面所有操作都是在所有操作都是在目錄:D:JNI 下進行的。

  一、編寫帶有?native?聲明的方法的java類

 1 public class HelloJNI {
 2     //native 關鍵字告訴 JVM 調用的是該方法在外部定義
 3     private native void helloJNI();
 4     
 5     static{
 6         System.loadLibrary("helloJNI");//載入本地庫
 7     }
 8     public static void main(String[] args) {
 9         HelloJNI jni = new HelloJNI();
10         jni.helloJNI();
11     }
12 
13 }
View Code

  用 native 聲明的方法表示告知 JVM 調用,該方法在外部定義,也就是我們會用 C 語言去實現。

  System.loadLibrary("helloJNI");加載動態庫,參數 helloJNI 是動態庫的名字。我們可以這樣理解:程序中的方法?helloJNI() 在程序中沒有實現,但是我們下面要調用這個方法,怎么辦呢?我們就需要對這個方法進行初始化,所以用 static 代碼塊進行初始化。

  這時候如果我們直接運行該程序,會報“A Java Exception has occurred”錯誤:

  

  二、使用?javac?命令編譯所編寫的java類,生成.class文件

  

  執行上述命令后,生成 HelloJNI.class 文件:

  

  三、使用?javah -jni? java類名?生成擴展名為 h 的頭文件

  

  執行上述命令后,在 D:/JNI 目錄下多出了個 HelloJNI.h 文件:

  

  四、使用C語言實現本地方法

  如果不想安裝visual studio?的,我們需要在 windows平臺安裝 gcc。

  安裝教程如下:http://blog.csdn.net/altland/article/details/63252757

  注意安裝版本的選擇,根據系統是32位還是64位來選擇。64位點擊下載。

  安裝完成之后注意配置環境變量,在 cmd 中輸入 g++ -v,如果出現如下信息,則安裝配置完成:

  

  接著輸入如下命令:

gcc -m64  -Wl,--add-stdcall-alias -I"C:Program FilesJavajdk1.8.0_152include" -I"C:Program FilesJavajdk1.8.0_152includeincludewin32" -shared -o helloJNI.dll helloJNI.c
View Code

  -m64表示生成dll庫是64位的。后面的路徑表示本機安裝的JDK路徑。生成之后多了一個helloJNI.dll 文件

  

  最后運行 HelloJNI:輸出 Hello JNI! 大功告成。

  

  

4、JNI調用C的流程圖

  

  圖片引用自:https://www.cnblogs.com/Qian123/p/5702574.html

  

5、native關鍵字

  通過上面介紹了那么多JNI的知識,終于到介紹本篇文章的主角——native 關鍵字了。相信大家看完上面的介紹,應該也是知道什么是 native 了吧。

  native 用來修飾方法,用 native 聲明的方法表示告知 JVM 調用,該方法在外部定義,我們可以用任何語言去實現它。?簡單地講,一個native Method就是一個 Java 調用非 Java 代碼的接口。

  native 語法:

 ?、?、修飾方法的位置必須在返回類型之前,和其余的方法控制符前后關系不受限制。

 ?、?、不能用 abstract 修飾,也沒有方法體,也沒有左右大括號。

 ?、?、返回值可以是任意類型

  我們在日常編程中看到native修飾的方法,只需要知道這個方法的作用是什么,至于別的就不用管了,操作系統會給我們實現。

  

參考文檔:https://docs.oracle.com/javase/8/docs/technotes/guides/jni/spec/jniTOC.html 

     https://www.cnblogs.com/Qian123/p/5702574.html

當前文章:http://www.hfcxdn.com/R/57193.html

發布時間:2019-02-20 02:35:07

免費棋牌游戲平臺 怎么下載大連娛網棋牌 萬豪棋牌水滸傳怎么玩 九天棋牌app下載 牌友都市app 馬克菠蘿教學2019視頻 線上德州撲克的區別 延吉麻將手機版

編輯:乙海董秉

我要說兩句: (0人參與)

發布
捕鱼达人之深海狩猎