要通過Java Native Interface (JNI) 調用動態加載本地庫中的類,您需要遵循以下步驟:
首先,創建一個包含native方法聲明的Java類。例如,創建名為NativeLibrary
的Java類:
public class NativeLibrary {
static {
System.loadLibrary("native-lib");
}
public native String getMessageFromNative();
public static void main(String[] args) {
NativeLibrary nativeLibrary = new NativeLibrary();
System.out.println("Message from native library: " + nativeLibrary.getMessageFromNative());
}
}
在這個例子中,我們聲明了一個名為getMessageFromNative
的native方法。
使用javac
編譯Java類,然后使用javah
生成JNI頭文件。在命令行中,導航到包含已編譯類文件的目錄(通常是target/classes
或build/classes
),然后運行以下命令:
javah -jni com.example.NativeLibrary
這將生成一個名為com_example_NativeLibrary.h
的頭文件。
創建一個C或C++文件,包含在步驟2中生成的JNI頭文件。實現相應的本地方法。例如,創建一個名為native-lib.c
的文件:
#include <jni.h>
#include "com_example_NativeLibrary.h"
#include<string.h>
JNIEXPORT jstring JNICALL Java_com_example_NativeLibrary_getMessageFromNative(JNIEnv *env, jobject obj) {
return (*env)->NewStringUTF(env, "Hello from native library!");
}
使用C或C++編譯器(如gcc或g++)編譯本地代碼,并鏈接生成的共享庫。例如,在Linux上,運行以下命令:
gcc -shared -fPIC -o libnative-lib.so native-lib.c -I${JAVA_HOME}/include -I${JAVA_HOME}/include/linux
在Windows上,運行以下命令:
gcc -shared -o native-lib.dll native-lib.c -I"%JAVA_HOME%\include" -I"%JAVA_HOME%\include\win32"
確保生成的共享庫(libnative-lib.so
或native-lib.dll
)位于Java庫路徑中,然后運行Java程序。例如,在命令行中運行以下命令:
java -Djava.library.path=. com.example.NativeLibrary
這將輸出以下內容:
Message from native library: Hello from native library!
現在,您已經成功地通過JNI調用了動態加載本地庫中的類。