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中的native關鍵字講解

當我們運行這個程序時,應該生成一個庫。

輸出:

這裡我們從java代碼創建瞭頭文件,它將本地代碼和java語言鏈接起來。

Java中的native關鍵字講解

四、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之間鴻溝的橋梁。如果我們的軟件與硬件的交互在使用預先存在的代碼時更有效,那麼這可以作為一個關鍵環節。與從頭開始設計新的應用程序代碼相比,隻要可以避免,它就可以使實現工作更少。

推薦閱讀: