Java中的Native關(guān)鍵字講解
前言:
native
關(guān)鍵字充當(dāng)JAVA語(yǔ)言與除JAVA之外的其他語(yǔ)言編寫的代碼塊或庫(kù)之間的鏈接,這可能取決于您操作的機(jī)器。如果將native
關(guān)鍵字應(yīng)用于一個(gè)方法,那么這意味著該方法將通過(guò)JNI(JAVA native interface
)使用其他語(yǔ)言(如C或C++)編寫的本機(jī)代碼來(lái)實(shí)現(xiàn)。
一、Java中Native關(guān)鍵字的語(yǔ)法
本機(jī)代碼的語(yǔ)法與普通函數(shù)定義相同,在函數(shù)開頭添加了“native”關(guān)鍵字。
例如:
Public class testing {public native String testMethod (String parameter);}
在這里,public
是一個(gè)訪問(wèn)修飾符。它應(yīng)該是公共的,以便其他文件可以使用它。字符串是函數(shù)的返回?cái)?shù)據(jù)類型。它可以是整數(shù)、字符或布爾值,具體取決于關(guān)鍵字。傳遞給此函數(shù)的參數(shù)也是數(shù)據(jù)類型字符串。一切都應(yīng)該保持在社會(huì)底層。
在函數(shù)聲明之后,我們通過(guò)創(chuàng)建對(duì)象和加載庫(kù)來(lái)調(diào)用這個(gè)函數(shù)。
public static void main(String[] args) { System.loadLibrary("testing"); testing testingnew = new testing(); String output = testingnew.stringMethod("NATIVE"); }
應(yīng)首先加載上面定義的庫(kù),并創(chuàng)建對(duì)象。在這個(gè)對(duì)象的幫助下,本機(jī)函數(shù)被調(diào)用。
二、Native關(guān)鍵字是如何工作的?
應(yīng)該有兩個(gè)文件。一個(gè)包含JAVA代碼,而另一個(gè)應(yīng)該包含C/C++
遺留代碼。Java代碼將用于調(diào)用遺留代碼。此遺留代碼將與硬件交互并返回預(yù)期輸出。
當(dāng)遺留代碼與硬件交互時(shí),它將不會(huì)遵循JAVA制定的準(zhǔn)則。此代碼將執(zhí)行所需的處理,以獲得輸出并將結(jié)果傳遞給JNI。Java本機(jī)接口隨后將檢入其目錄,其中包含與本機(jī)代碼相關(guān)的所有規(guī)則(這在SDK中位于名為javah.exe的文件下)。JNI是作為Java工具包的一部分設(shè)計(jì)的。在此處理之后,JAVA將以JAVA語(yǔ)言本身發(fā)布輸出。當(dāng)我們創(chuàng)建JAVA程序時(shí),我們必須確保JAVA文件和遺留文件之間有一個(gè)變量/數(shù)據(jù)流鏈接,以便兩者之間有一個(gè)平滑的數(shù)據(jù)流。
下面給出了解釋如何使用本機(jī)關(guān)鍵字的步驟:
- 1. 編寫包含本機(jī)方法、已加載的共享庫(kù)的JAVA代碼,并使用“filename.JAVA”保存它。
- 2. 編譯JAVA代碼并將代碼轉(zhuǎn)換為字節(jié)碼。
- 3. 創(chuàng)建包含應(yīng)調(diào)用的本機(jī)函數(shù)簽名的C/C++頭文件。
- 4. 編寫C/C++代碼有一個(gè)本機(jī)方法的實(shí)現(xiàn)。
- 5. 運(yùn)行JAVA可執(zhí)行文件以查看結(jié)果。
三、代碼示例
我們?cè)?code>Eclipse中編寫代碼并運(yùn)行代碼來(lái)創(chuàng)建一個(gè)庫(kù),然后使用該庫(kù)來(lái)實(shí)現(xiàn)C代碼。
代碼:
public class JPP { public static native void pAccess(); public static native int pRead(); public static native void pWrite(int port, int output); static{ System.loadLibrary("JPPlibs"); } public void jAccess(){ JPP.pAccess(); } public int jRead(){ return JPP.pRead(); } public void jWrite(int port, int output){ JPP.pWrite(port, output); } }
在將此代碼保存到j(luò)ava項(xiàng)目的新“類”中之后,我們必須設(shè)置一個(gè)運(yùn)行環(huán)境來(lái)生成頭文件。
當(dāng)我們運(yùn)行這個(gè)程序時(shí),應(yīng)該生成一個(gè)庫(kù)。
輸出:
這里我們從java代碼創(chuàng)建了頭文件,它將本地代碼和java語(yǔ)言鏈接起來(lái)。
四、Java中Native關(guān)鍵字的優(yōu)勢(shì)
下面給出了一些優(yōu)點(diǎn):
- 它為JAVA提供了一個(gè)額外的優(yōu)勢(shì),可以與用其他語(yǔ)言編寫的代碼交互,并減少用JAVA編寫相同代碼的工作量,從而減少代碼冗余。
- 它提高了總體代碼性能。由于代碼是用其他語(yǔ)言編寫的,因此使用機(jī)器語(yǔ)言時(shí)可能比使用JAVA更快。然后我們可以使用JAVA程序調(diào)用此代碼。
- 使用這種方法,我們可以直接進(jìn)行系統(tǒng)調(diào)用。降低外部干擾的概率,提高代碼執(zhí)行速度。
- 您可以使用用JAVA編寫的任意驅(qū)動(dòng)代碼動(dòng)態(tài)調(diào)用預(yù)加載的庫(kù)(用JAVA以外的任何語(yǔ)言編寫),仍然可以用JAVA獲得響應(yīng)。
- 它使JAVA能夠訪問(wèn)硬件資源,而這些硬件資源只能由其他語(yǔ)言使用。
- 如果您已經(jīng)為應(yīng)用程序構(gòu)建了一個(gè)依賴于平臺(tái)的代碼,并且其功能不受JAVA支持,那么我們可以使用本機(jī)代碼,并通過(guò)native關(guān)鍵字將本機(jī)代碼鏈接到JAVA。
五、規(guī)則
native關(guān)鍵字的規(guī)則如下所示:
native
關(guān)鍵字將在方法名稱之前使用。
- native方法聲明沒(méi)有正文,應(yīng)該以分號(hào)結(jié)尾,因?yàn)檫@些方法不是在JAVA中定義的,而是在C/C++語(yǔ)言中出現(xiàn)的。
- native方法不能聲明為抽象方法。
- 由于無(wú)法保證以前的舊代碼是否按照IEEE 754標(biāo)準(zhǔn)編寫(IEEE浮點(diǎn)算法標(biāo)準(zhǔn)是1985年由電氣和電子工程師協(xié)會(huì)制定的浮點(diǎn)算法技術(shù)標(biāo)準(zhǔn)),因此我們不能將這些原生方法聲明為嚴(yán)格FTP。
- JAVA設(shè)計(jì)JAVA本機(jī)
native
接口(JNI)規(guī)范來(lái)定義實(shí)現(xiàn)本機(jī)方法的規(guī)則和聲明,如JAVA和native代碼之間的數(shù)據(jù)類型轉(zhuǎn)換。
六、總結(jié)
native
關(guān)鍵字是架起本機(jī)語(yǔ)言和JAVA之間鴻溝的橋梁。如果我們的軟件與硬件的交互在使用預(yù)先存在的代碼時(shí)更有效,那么這可以作為一個(gè)關(guān)鍵環(huán)節(jié)。與從頭開始設(shè)計(jì)新的應(yīng)用程序代碼相比,只要可以避免,它就可以使實(shí)現(xiàn)工作更少。
相關(guān)文章
Java數(shù)據(jù)結(jié)構(gòu)之常見排序算法(上)
這篇文章主要介紹了Java數(shù)據(jù)結(jié)構(gòu)之常見排序算法,本文章是匯總篇,且對(duì)每個(gè)排序都進(jìn)行了說(shuō)明,可以很好的理清思路,對(duì)排序算法有個(gè)總體的框架,需要的朋友可以參考下2023-01-01Dubbo新版本zk注冊(cè)中心連接問(wèn)題及解決
這篇文章主要介紹了Dubbo新版本zk注冊(cè)中心連接問(wèn)題及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-05-05java 使用URLDecoder和URLEncoder對(duì)中文進(jìn)行處理
這篇文章主要介紹了java 使用URLDecoder和URLEncoder對(duì)中文進(jìn)行處理的相關(guān)資料,需要的朋友可以參考下2017-02-02JavaWeb實(shí)現(xiàn)顯示mysql數(shù)據(jù)庫(kù)數(shù)據(jù)
MySQL是最流行的關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng),在WEB應(yīng)用方面MySQL是最好的。本文將利用JavaWeb實(shí)現(xiàn)顯示mysql數(shù)據(jù)庫(kù)數(shù)據(jù)功能,需要的可以參考一下2022-03-03mybatis-generator自動(dòng)生成dao、mapping、bean配置操作
這篇文章主要介紹了mybatis-generator自動(dòng)生成dao、mapping、bean配置操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-08-08java實(shí)現(xiàn)日歷(某年的日歷,某月的日歷)用戶完全自定義
本篇文章介紹了,java實(shí)現(xiàn)日歷(某年的日歷,某月的日歷)用戶完全自定義。需要的朋友參考下2013-05-05Java中由substring方法引發(fā)的內(nèi)存泄漏詳解
這篇文章主要介紹了Java中由substring方法引發(fā)的內(nèi)存泄漏詳解,涉及substring方法引發(fā)的內(nèi)存泄漏簡(jiǎn)介,substring的作用和實(shí)現(xiàn)原理等相關(guān)內(nèi)容,具有一定借鑒價(jià)值,需要的朋友可以參考下2017-12-12