Java 原生方法入門

只有在純 Java™ 無法符合您的程式設計需求時,您才應該使用原生方法。

僅在下列情況下使用原生方法,以限制使用原生方法:
  • 使用純 Java 來存取無法使用的系統功能。
  • 實作可從原生實作大幅獲益的效能敏感方法。
  • 連接至容許 Java 呼叫其他 API 的現有應用程式設計介面 (API)。

下列指示適用於將 Java 原生介面 (JNI) 與 C 語言搭配使用。 如需搭配使用 JNI 與 RPG 語言的相關資訊,請參閱 WebSphere® Development Studio: ILE RPG Programmer 's Guide SC09-2507第 11 章。

附註: 術語原生程式庫或原生方法程式庫是指在 ILE 原生方法的環境定義中使用的整合語言環境 (ILE) 服務程式,以及在 PASE for i 原生方法的環境定義中使用的 AIX® 靜態或共用程式庫。

如果要建立 Java 原生方法,請執行下列步驟:

  1. 建立 Java 類別,並使用標準 Java 語言語法指定哪些方法是原生方法。

    在類別的靜態起始設定元中,您需要新增程式碼來載入原生程式庫,其中包含原生方法的 C 實作。 您可以使用 System.load()System.loadLibrary() Java 方法來載入原生程式庫。 System.load() 方法採用原生程式庫的完整路徑作為參數,並載入指定的原生程式庫。 System.loadLibrary() 會以程式庫名稱作為參數,尋找對應於該名稱的原生程式庫,並載入原生程式庫。 如需 System.loadLibrary() 方法如何找到原生程式庫的相關資訊,請參閱 管理原生方法程式庫

    您需要注意下列程式庫命名慣例:

    • 如果原生方法是 ILE 原生方法 ,且 Java 程式碼載入名為 Sample的程式庫,則對應的執行檔必須是名為 SAMPLE的 ILE 服務程式。 下列顯示如何載入 ILE 原生程式庫:
      System.loadLibrary("Sample");
      
      System.load("/qsys.lib/mylib.lib/Sample.srvpgm");
      附註: 在這些程式庫載入方法中可以使用服務程式的符號鏈結。
    • 如果原生方法是 PASE for i 原生方法 ,且 Java 程式碼載入名為 Sample的程式庫,則對應的執行檔必須是名為 libSample.alibSample.so的 AIX 程式庫。 下列顯示如何載入 PASE for i 原生程式庫:
      System.loadLibrary("Sample");
      
      System.load("/somedir/libSample.so");
  2. 使用 javac 工具,將 Java 原始檔編譯成類別檔。
  3. 使用 javah 工具來建立標頭檔 (.h)。 這個標頭檔包含用來建立原生方法實作的確切原型。 -d 選項指定您應該在其中建立標頭檔的目錄。
  4. 撰寫原生方法的 C 實作程式碼。 如需用於原生方法之語言和函數的詳細資料,請參閱 Java 原生方法和執行緒考量 主題。
    1. 包括在先前步驟中建立的標頭檔。
    2. 完全符合標頭檔中的原型。
    3. 如果您的原生方法必須與 Java 虛擬機器互動,請使用 JNI 隨附的函數。
    4. 僅限 ILE 原生方法,如果要將字串傳遞至 Java 虛擬機器,請將字串轉換成「美國資訊交換標準碼 (ASCII)」。 如需相關資訊,請參閱 ILE 原生方法中的字串
  5. 將原生方法的 C 實作程式碼編譯成原生程式庫。
    • 對於 ILE 原生方法,請使用「建立 C 模組 (CRTCMOD)」指令將原始檔編譯成模組物件。 然後使用「建立服務程式 (CRTSRVPGM)」指令,將一個以上模組物件連結至服務程式。 此服務程式的名稱必須符合您在 Java 程式碼 (位於 System.load()System.loadLibrary() Java 方法呼叫中) 中提供的名稱。
      附註: 原生方法的實作程式碼必須在啟用兆空間儲存體的情況下編譯。 如需兆空間和原生方法的相關資訊,請參閱 Java 的兆空間儲存體模型原生方法
    • 對於 PASE for i 原生方法,請使用 xlcxlc_r 指令來編譯並建置 AIX 程式庫。 如需編譯及建置 PASE for i程式庫的相關資訊,請參閱 編譯 AIX 來源 主題。
  6. 如果您在 Java 程式碼中使用 System.loadLibrary() 呼叫來載入原生程式庫,請執行下列其中一項作業:
    • LIBPATH 環境變數中包含您需要的原生程式庫路徑清單。 您可以從 IBM i 指令行變更 QShell 中的 LIBPATH 環境變數。
      • 從 Qshell 命令提示字元,鍵入:
        export LIBPATH=/QSYS.LIB/MYLIB.LIB
        java  myclass
      • 或者,從指令行:
        ADDENVVAR LIBPATH '/QSYS.LIB/MYLIB.LIB'
        JAVA  myclass
    • 或者,在 java.library.path 內容中提供清單。 您可以在 QShell 中以及從 IBM i 指令行變更 java.library.path 內容。
      • 從 Qshell 命令提示字元中,輸入:
        java -Djava.library.path=/QSYS.LIB/MYLIB.LIB  myclass
      • 或者,從 IBM i 指令行鍵入:
        JAVA PROP((java.library.path '/QSYS.LIB/MYLIB.LIB')) myclass

    其中 /QSYS.LIB/MYLIB.LIB 是包含您要使用 System.loadLibrary() 呼叫載入之原生程式庫的路徑,而 myclass 是 Java 應用程式的名稱。

    如需 System.loadLibrary() 方法如何找到原生程式庫的相關資訊,請參閱 管理原生方法程式庫

如需 ILE 原生方法的範例,請參閱 範例 :Java 的 ILE 原生方法。 如需 PASE for i 原生方法的範例,請參閱 範例: IBM PASE for i native method for Java