在 Java 中編寫本機方法

Mehvish Ashiq 2024年2月15日
  1. Java 中的本機方法是什麼
  2. 在 Java 程式中編寫本機方法
在 Java 中編寫本機方法

本文將引導你完成學習如何在 Java 程式中編寫本機方法所需的各個步驟。

Java 中的本機方法是什麼

native 關鍵字是 Java 程式設計中的修飾符,僅與方法一起使用。它表示此特定方法是通過 Java 本機介面 (JNI) 以本機程式碼編寫的。

本機(或外來)方法在 C、C++ 或任何其他平臺相關程式碼中實現。

語法:

[public/protected/private] native [returnType] youMethodName();

在 Java 程式中編寫本機方法

下面列出了在 Java 程式中編寫本機方法的多步驟過程:

  • 編寫包含 native 方法的宣告和呼叫 native 方法的 main 方法的 Java 程式。
  • 用 main 方法編譯 Java 程式並宣告指定的 native 方法。
  • 使用帶有 -jni 標誌的 javah 來為本地方法建立標頭檔案。
  • 用你喜歡的程式語言編寫本機方法的程式碼,例如 C/C++。
  • 建立共享庫來編譯實現和標頭檔案。
  • 最後,執行/執行 Java 程式。

讓我們按照所有這些步驟在 Java 程式中呼叫本機方法。

編寫 Java 程式

class nativeDemoClass {
  // declaration of the native method
  public native void showMessage();

  // load native C library
  static {
    System.loadLibrary("nativedemoclass"); // lowercase of classname
  }

  // java main method
  public static void main(String[] args) {
    nativeDemoClass demo = new nativeDemoClass();
    demo.showMessage();
  }
}

如果我們用 Java 以外的程式語言實現方法,則必須在 Java 程式中包含 native 關鍵字作為方法的宣告部分。

這個 native 關鍵字告訴 Java 編譯器這個特定的方法是一個本地程式語言方法。請記住,Java 程式中本地方法的宣告僅提供方法簽名。

我們有一個 static 塊,它載入本機 C 庫,我們在其中編寫了 showMessage() 方法的實現。你是否注意到我們正在向 System.loadLibrary() 方法傳遞一個字串?

為什麼會這樣?這是因為來自 nativeDemoClass 類的這個 static 塊將載入適當的庫,名為 nativedemoclass

讓我們進入第二步,編譯 Java 程式。

編譯 Java 程式

使用下面給出的命令編譯 Java 程式。

javac nativeDemoClass.java

成功編譯 Java 程式後,我們得到 nativeDemoClass.class 檔案。

建立標頭檔案

使用以下命令建立標頭檔案。

這裡,-h 生成 C/C++ 標頭檔案並將生成的檔案放入指定目錄。我們使用點(.)將生成的標頭檔案儲存在當前目錄中。

javac -h . nativeDemoClass.java
注意
你可能會在 Internet 上發現 javah 建立 C/C++ 標頭檔案,這在 JDK 8 之前是正確的。根據 oraclejavah 現在已被棄用,但我們在上面給出了替代解決方案。

nativeDemoClass.h 檔案如下所示。我們不編輯它,因為它是機器生成的檔案。

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class nativeDemoClass */

#ifndef _Included_nativeDemoClass
#define _Included_nativeDemoClass
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     nativeDemoClass
 * Method:    showMessage
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_nativeDemoClass_showMessage(JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif

JNIEXPORT void JNICALL Java_nativeDemoClass_showMessage 在此標頭檔案中宣告瞭 C 函式。如果 nativeDemoClass 有更多的本地方法,我們可以有多個函式簽名。

實現本機方法的本機語言方法的名稱包含以下內容:

  • 字首為 Java_
  • 包名
  • 類名稱
  • native 方法的名稱

每個部分用下劃線 (_) 分隔,如下圖所示:

用 Java 編寫本機方法 - 命名約定

此外,JNIEnv* 指的是 Java Native Interface 環境,它允許我們訪問 Java Native Interface (JNI) 方法。jobject 引用了 Java 程式設計的這個物件。

編寫本機程式碼

#include <jni.h>
#include <stdio.h>

#include "nativeDemoClass.h"

JNIEXPORT void JNICALL Java_nativeDemoClass_showMessage(JNIEnv *env,
                                                        jobject obj) {
  printf("Hello world!\n");
  return;
}

Java_nativeDemoClass_showMessage 的實現非常簡單,因為我們只使用 printf() 語句來列印 Hello world。請記住,這個 .c 檔案有三個標頭檔案,jni.hstdio.hnativeDemoClass.h 在上一步中建立。

建立共享庫

使用以下命令建立共享庫。我們必須有 build tools for visual studio 才能使用 CL 命令。

cl -Ic:\java\jdk-17.0.2\include -Ic:\java\jdk-17.0.2\include\win32 -LD nativeDemoClassImp.c -Fenativedemoclass.dll

請記住,Java 程式在執行時使用以下方法載入名為 nativedemoclass 的共享庫。

System.loadLibrary("nativedemoclass");

執行 Java 程式

最後,使用下面給出的命令執行 Java 程式。

java nativeDemoClass

你會看到 Hello world!如果你已正確完成所有操作,請在命令列上。

輸出:

用 Java 編寫本機方法 - 輸出

作者: Mehvish Ashiq
Mehvish Ashiq avatar Mehvish Ashiq avatar

Mehvish Ashiq is a former Java Programmer and a Data Science enthusiast who leverages her expertise to help others to learn and grow by creating interesting, useful, and reader-friendly content in Computer Programming, Data Science, and Technology.

LinkedIn GitHub Facebook

相關文章 - Java Method