Java中的Native關鍵字講解
前言:
native
關鍵字充當JAVA語言與除JAVA之外的其他語言編寫的代碼塊或庫之間的鏈接,這可能取決於您操作的機器。如果將native
關鍵字應用於一個方法,那麼這意味著該方法將通過JNI(JAVA native interface
)使用其他語言(如C或C++)編寫的本機代碼來實現。
一、Java中Native關鍵字的語法
本機代碼的語法與普通函數定義相同,在函數開頭添加瞭“native”關鍵字。
例如:
Public class testing {public native String testMethod (String parameter);}
在這裡,public
是一個訪問修飾符。它應該是公共的,以便其他文件可以使用它。字符串是函數的返回數據類型。它可以是整數、字符或佈爾值,具體取決於關鍵字。傳遞給此函數的參數也是數據類型字符串。一切都應該保持在社會底層。
在函數聲明之後,我們通過創建對象和加載庫來調用這個函數。
public static void main(String[] args) { System.loadLibrary("testing"); testing testingnew = new testing(); String output = testingnew.stringMethod("NATIVE"); }
應首先加載上面定義的庫,並創建對象。在這個對象的幫助下,本機函數被調用。
二、Native關鍵字是如何工作的?
應該有兩個文件。一個包含JAVA代碼,而另一個應該包含C/C++
遺留代碼。Java代碼將用於調用遺留代碼。此遺留代碼將與硬件交互並返回預期輸出。
當遺留代碼與硬件交互時,它將不會遵循JAVA制定的準則。此代碼將執行所需的處理,以獲得輸出並將結果傳遞給JNI。Java本機接口隨後將檢入其目錄,其中包含與本機代碼相關的所有規則(這在SDK中位於名為javah.exe的文件下)。JNI是作為Java工具包的一部分設計的。在此處理之後,JAVA將以JAVA語言本身發佈輸出。當我們創建JAVA程序時,我們必須確保JAVA文件和遺留文件之間有一個變量/數據流鏈接,以便兩者之間有一個平滑的數據流。
下面給出瞭解釋如何使用本機關鍵字的步驟:
- 1. 編寫包含本機方法、已加載的共享庫的JAVA代碼,並使用“filename.JAVA”保存它。
- 2. 編譯JAVA代碼並將代碼轉換為字節碼。
- 3. 創建包含應調用的本機函數簽名的C/C++頭文件。
- 4. 編寫C/C++代碼有一個本機方法的實現。
- 5. 運行JAVA可執行文件以查看結果。
三、代碼示例
我們在Eclipse
中編寫代碼並運行代碼來創建一個庫,然後使用該庫來實現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); } }
在將此代碼保存到java項目的新“類”中之後,我們必須設置一個運行環境來生成頭文件。
當我們運行這個程序時,應該生成一個庫。
輸出:
這裡我們從java代碼創建瞭頭文件,它將本地代碼和java語言鏈接起來。
四、Java中Native關鍵字的優勢
下面給出瞭一些優點:
- 它為JAVA提供瞭一個額外的優勢,可以與用其他語言編寫的代碼交互,並減少用JAVA編寫相同代碼的工作量,從而減少代碼冗餘。
- 它提高瞭總體代碼性能。由於代碼是用其他語言編寫的,因此使用機器語言時可能比使用JAVA更快。然後我們可以使用JAVA程序調用此代碼。
- 使用這種方法,我們可以直接進行系統調用。降低外部幹擾的概率,提高代碼執行速度。
- 您可以使用用JAVA編寫的任意驅動代碼動態調用預加載的庫(用JAVA以外的任何語言編寫),仍然可以用JAVA獲得響應。
- 它使JAVA能夠訪問硬件資源,而這些硬件資源隻能由其他語言使用。
- 如果您已經為應用程序構建瞭一個依賴於平臺的代碼,並且其功能不受JAVA支持,那麼我們可以使用本機代碼,並通過native關鍵字將本機代碼鏈接到JAVA。
五、規則
native關鍵字的規則如下所示:
native
關鍵字將在方法名稱之前使用。
- native方法聲明沒有正文,應該以分號結尾,因為這些方法不是在JAVA中定義的,而是在C/C++語言中出現的。
- native方法不能聲明為抽象方法。
- 由於無法保證以前的舊代碼是否按照IEEE 754標準編寫(IEEE浮點算法標準是1985年由電氣和電子工程師協會制定的浮點算法技術標準),因此我們不能將這些原生方法聲明為嚴格FTP。
- JAVA設計JAVA本機
native
接口(JNI)規范來定義實現本機方法的規則和聲明,如JAVA和native代碼之間的數據類型轉換。
六、總結
native
關鍵字是架起本機語言和JAVA之間鴻溝的橋梁。如果我們的軟件與硬件的交互在使用預先存在的代碼時更有效,那麼這可以作為一個關鍵環節。與從頭開始設計新的應用程序代碼相比,隻要可以避免,它就可以使實現工作更少。