欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java關(guān)鍵字之native詳解

 更新時(shí)間:2022年01月19日 15:33:14   作者:YSOcean  
這篇文章主要為大家介紹了Java關(guān)鍵字之native,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助

本篇博客我們將介紹Java中的一個(gè)關(guān)鍵字——native。

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

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

那么為什么要用 native 來(lái)修飾方法,這樣做有什么用?

1、JNI:Java Native Interface

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

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

  • ①、標(biāo)準(zhǔn)的 Java 類庫(kù)不支持應(yīng)用程序平臺(tái)所需的平臺(tái)相關(guān)功能。
  • ②、我們已經(jīng)用另一種語(yǔ)言編寫了一個(gè)類庫(kù),如何用Java代碼調(diào)用?
  • ③、某些運(yùn)行次數(shù)特別多的方法代碼,為了加快性能,我們需要用更接近硬件的語(yǔ)言(比如匯編)編寫。

上面這三種需求,其實(shí)說(shuō)到底就是如何用 Java 代碼調(diào)用不同語(yǔ)言編寫的代碼。那么 JNI 應(yīng)運(yùn)而生了。

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

通過(guò) JNI,我們就可以通過(guò) Java 程序(代碼)調(diào)用到操作系統(tǒng)相關(guān)的技術(shù)實(shí)現(xiàn)的庫(kù)函數(shù),從而與其他技術(shù)和系統(tǒng)交互,使用其他技術(shù)實(shí)現(xiàn)的系統(tǒng)的功能;同時(shí)其他技術(shù)和系統(tǒng)也可以通過(guò) JNI 提供的相應(yīng)原生接口開調(diào)用 Java 應(yīng)用系統(tǒng)內(nèi)部實(shí)現(xiàn)的功能。

在windows系統(tǒng)上,一般可執(zhí)行的應(yīng)用程序都是基于 native 的PE結(jié)構(gòu),windows上的 JVM也是基于native結(jié)構(gòu)實(shí)現(xiàn)的。Java應(yīng)用體系都是構(gòu)建于 JVM 之上。  

可能有人會(huì)問(wèn),Java不是跨平臺(tái)的嗎?如果用 JNI,那么程序不就將失去跨平臺(tái)的優(yōu)點(diǎn)?確實(shí)是這樣的。

JNI 的缺點(diǎn):

①、程序不再跨平臺(tái)。要想跨平臺(tái),必須在不同的系統(tǒng)環(huán)境下重新編譯本地語(yǔ)言部分。

②、程序不再是絕對(duì)安全的,本地代碼的不當(dāng)使用可能導(dǎo)致整個(gè)程序崩潰。一個(gè)通用規(guī)則是,你應(yīng)該讓本地方法集中在少數(shù)幾個(gè)類當(dāng)中。這樣就降低了JAVA和C之間的耦合性。

目前來(lái)講使用 JNI 的缺點(diǎn)相對(duì)于優(yōu)點(diǎn)還是可以接受的,可能后面隨著 Java 的技術(shù)發(fā)展,我們不在需要 JNI,但是目前 JDK 還是一直提供對(duì) JNI 標(biāo)準(zhǔn)的支持。

2、用C語(yǔ)言編寫程序本地方法

上面講解了什么是 JNI,那么我們接下來(lái)就寫個(gè)例子,如何用 Java 代碼調(diào)用本地的 C 程序。

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

步驟如下:

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

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

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

④、使用C/C++(或者其他編程想語(yǔ)言)實(shí)現(xiàn)本地方法,創(chuàng)建.h文件的實(shí)現(xiàn),也就是創(chuàng)建.cpp文件實(shí)現(xiàn).h文件中的方法;

⑤、將C/C++編寫的文件生成動(dòng)態(tài)連接庫(kù),生成dll文件;

下面我們通過(guò)一個(gè) HelloWorld 程序的調(diào)用來(lái)完成這幾個(gè)步驟。

注意:下面所有操作都是在所有操作都是在目錄:D:\JNI 下進(jìn)行的。

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

public class HelloJNI {
    //native 關(guān)鍵字告訴 JVM 調(diào)用的是該方法在外部定義
    private native void helloJNI();

    static{
        System.loadLibrary("helloJNI");//載入本地庫(kù)
    }
    public static void main(String[] args) {
        HelloJNI jni = new HelloJNI();
        jni.helloJNI();
    }

}

用 native 聲明的方法表示告知 JVM 調(diào)用,該方法在外部定義,也就是我們會(huì)用 C 語(yǔ)言去實(shí)現(xiàn)。

System.loadLibrary("helloJNI");加載動(dòng)態(tài)庫(kù),參數(shù) helloJNI 是動(dòng)態(tài)庫(kù)的名字。我們可以這樣理解:程序中的方法helloJNI() 在程序中沒(méi)有實(shí)現(xiàn),但是我們下面要調(diào)用這個(gè)方法,怎么辦呢?我們就需要對(duì)這個(gè)方法進(jìn)行初始化,所以用 static 代碼塊進(jìn)行初始化。

這時(shí)候如果我們直接運(yùn)行該程序,會(huì)報(bào)“A Java Exception has occurred”錯(cuò)誤:  

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

  

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

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

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

四、使用C語(yǔ)言實(shí)現(xiàn)本地方法

如果不想安裝visual studio的,我們需要在 windows平臺(tái)安裝 gcc。

注意安裝版本的選擇,根據(jù)系統(tǒng)是32位還是64位來(lái)選擇。64位點(diǎn)擊下載。

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

接著輸入如下命令:

gcc -m64  -Wl,--add-stdcall-alias -I"C:\Program Files\Java\jdk1.8.0_152\include" -I"C:\Program Files\Java\jdk1.8.0_152\include\include\win32" -shared -o helloJNI.dll helloJNI.c

-m64表示生成dll庫(kù)是64位的。后面的路徑表示本機(jī)安裝的JDK路徑。生成之后多了一個(gè)helloJNI.dll 文件

最后運(yùn)行 HelloJNI:輸出 Hello JNI! 大功告成。  

3、JNI調(diào)用C的流程圖

4、native關(guān)鍵字

通過(guò)上面介紹了那么多JNI的知識(shí),終于到介紹本篇文章的主角——native 關(guān)鍵字了。相信大家看完上面的介紹,應(yīng)該也是知道什么是 native 了吧。

native 用來(lái)修飾方法,用 native 聲明的方法表示告知 JVM 調(diào)用,該方法在外部定義,我們可以用任何語(yǔ)言去實(shí)現(xiàn)它。簡(jiǎn)單地講,一個(gè)native Method就是一個(gè) Java 調(diào)用非 Java 代碼的接口。

native 語(yǔ)法:

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

②、不能用 abstract 修飾,也沒(méi)有方法體,也沒(méi)有左右大括號(hào)。

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

我們?cè)谌粘>幊讨锌吹絥ative修飾的方法,只需要知道這個(gè)方法的作用是什么,至于別的就不用管了,操作系統(tǒng)會(huì)給我們實(shí)現(xiàn)。

總結(jié)

本篇文章就到這里了,希望能夠給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!

相關(guān)文章

  • Spring Boot 中的 @Field 注解的原理解析

    Spring Boot 中的 @Field 注解的原理解析

    本文詳細(xì)介紹了 Spring Boot 中的 @Field 注解的原理和使用方法,通過(guò)使用 @Field 注解,我們可以將 HTTP 請(qǐng)求中的參數(shù)值自動(dòng)綁定到 Java 對(duì)象的屬性上,簡(jiǎn)化了開發(fā)過(guò)程,提高了開發(fā)效率,感興趣的朋友跟隨小編一起看看吧
    2023-07-07
  • Spring?Boot和Vue前后端分離項(xiàng)目架構(gòu)的全過(guò)程

    Spring?Boot和Vue前后端分離項(xiàng)目架構(gòu)的全過(guò)程

    前后端分離是目前互聯(lián)網(wǎng)開發(fā)中比較廣泛使用的開發(fā)模式,主要是將前端和后端的項(xiàng)目業(yè)務(wù)進(jìn)行分離,下面這篇文章主要給大家介紹了關(guān)于Spring?Boot和Vue前后端分離項(xiàng)目架構(gòu)的相關(guān)資料,需要的朋友可以參考下
    2022-04-04
  • Java批量寫入文件和下載圖片的示例代碼

    Java批量寫入文件和下載圖片的示例代碼

    這篇文章主要介紹了Java批量寫入文件和下載圖片的示例代碼,幫助大家更好的理解和使用Java,感興趣的朋友可以了解下
    2020-09-09
  • SpringBoot向容器注冊(cè)bean的方法詳解

    SpringBoot向容器注冊(cè)bean的方法詳解

    這篇文章主要利用示例為大家詳細(xì)介紹了SpringBoot如何向容器注冊(cè)bean(即:將對(duì)象加入容器)的四種方法,文中的示例代碼講解詳細(xì),需要的可以參考一下
    2022-05-05
  • java如何獲取request中json數(shù)據(jù)

    java如何獲取request中json數(shù)據(jù)

    這篇文章主要給大家介紹了關(guān)于java如何獲取request中json數(shù)據(jù)的相關(guān)資料,文中通過(guò)代碼示例以及圖文將獲取的方法介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用java具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-08-08
  • java使用poi在excel單元格添加超鏈接設(shè)置字體顏色的方法

    java使用poi在excel單元格添加超鏈接設(shè)置字體顏色的方法

    這篇文章主要介紹了java使用poi在excel單元格添加超鏈接,設(shè)置字體顏色,poi功能還是很強(qiáng)大的,基本能想到的功能都能通過(guò)poi實(shí)現(xiàn),本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2023-09-09
  • mybatis-4 mybatis與spring結(jié)合使用及原理解析

    mybatis-4 mybatis與spring結(jié)合使用及原理解析

    本文通過(guò)圖文并茂的形式給大家介紹了mybatis-4 mybatis與spring結(jié)合使用及原理解析,非常不錯(cuò),具有一定的參考借鑒價(jià)值 ,需要的朋友可以參考下
    2019-04-04
  • SpringCloud Feign多參數(shù)傳遞及需要注意的問(wèn)題

    SpringCloud Feign多參數(shù)傳遞及需要注意的問(wèn)題

    這篇文章主要介紹了SpringCloud Feign多參數(shù)傳遞及需要注意的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • Java中的二維數(shù)組的賦值與輸出方式

    Java中的二維數(shù)組的賦值與輸出方式

    這篇文章主要介紹了Java中的二維數(shù)組的賦值與輸出方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • java struts2框架簡(jiǎn)介

    java struts2框架簡(jiǎn)介

    本文主要介紹了java struts2框架的基礎(chǔ)知識(shí)。具有一定的參考價(jià)值,下面跟著小編一起來(lái)看下吧
    2017-01-01

最新評(píng)論