在 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
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
方法的名稱
每個部分用下劃線 (_
) 分隔,如下圖所示:
此外,JNIEnv*
指的是 Java Native Interface 環境,它允許我們訪問 Java Native Interface (JNI) 方法。jobject
引用了 Java 程式設計的這個物件。
編寫本機程式碼
#include <jni.h>
#include "nativeDemoClass.h"
#include <stdio.h>
JNIEXPORT void JNICALL
Java_nativeDemoClass_showMessage(JNIEnv *env, jobject obj)
{
printf("Hello world!\n");
return;
}
Java_nativeDemoClass_showMessage
的實現非常簡單,因為我們只使用 printf()
語句來列印 Hello world
。請記住,這個 .c
檔案有三個標頭檔案,jni.h
、stdio.h
和 nativeDemoClass.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!
如果你已正確完成所有操作,請在命令列上。
輸出: