一、DLL 介紹
DLL(Dynamic Link Library)是一種動態鏈接庫,即在程序運行時載入,不需要在編譯時鏈接。
由於 DLL 可以在多個程序中同時使用,所以它可以減少內存的消耗,提高代碼的重用率。
Java 可以通過 JNI(Java Native Interface)調用 DLL。
二、JNI
在 Java 中訪問非 Java 模塊需要使用 JNI,它提供了一系列的 API,使得 Java 代碼可以調用 C、C++ 或其他編程語言的本地代碼。
調用 DLL 可以使用 Java 中的 JNA 和 JNI,其中 JNA 是對 JNI 的封裝。
三、JNI 調用 DLL
下面介紹使用 JNI 實現 Java 調用 DLL 的詳細步驟:
1. 編寫 C 文件
在編寫 C 文件時,需要包含 jni.h
頭文件,並實現函數。
#include <jni.h> #include <stdlib.h> JNIEXPORT jstring JNICALL Java_com_example_HelloWorld_sayHello(JNIEnv *env, jobject obj) { return (*env)->NewStringUTF(env, "Hello, world!"); }
代碼解釋:
JNICALL
:表示這個函數是 JNI API 的一個實現,由系統在運行時調用。Java_com_example_HelloWorld_sayHello
:表示函數名,需要由 Java 類名和方法名拼接而成。JNIEnv
:是訪問 JVM 的環境介面。jobject
:是 Java 對象的引用類型。
2. 生成 DLL 文件
將 C 文件編譯成 DLL 文件,可以使用如下命令:
gcc -shared -o HelloWorld.dll HelloWorld.c
3. 在 Java 中載入 DLL
使用 System.loadLibrary
方法載入 DLL 文件。
System.loadLibrary("HelloWorld");
4. 在 Java 中聲明本地方法
在 Java 中聲明本地方法,並添加 native
關鍵字。
public class HelloWorld { public native String sayHello(); }
5. Java 調用本地方法
在 Java 中調用本地方法。
HelloWorld hello = new HelloWorld(); System.out.println(hello.sayHello());
四、完整示例代碼
下面是一個完整的 Java 調用 DLL 示例代碼:
1. HelloWorld.c 文件
#include <jni.h> #include <stdlib.h> JNIEXPORT jstring JNICALL Java_com_example_HelloWorld_sayHello(JNIEnv *env, jobject obj) { return (*env)->NewStringUTF(env, "Hello, world!"); }
2. 編譯 HelloWorld.c 文件
gcc -shared -o HelloWorld.dll HelloWorld.c
3. HelloWorld.java 文件
public class HelloWorld { public native String sayHello(); static { System.loadLibrary("HelloWorld"); } public static void main(String[] args) { HelloWorld hello = new HelloWorld(); System.out.println(hello.sayHello()); } }
4. 運行 HelloWorld.java 文件
執行 java HelloWorld
命令即可。
五、小結
通過 JNI 可以讓 Java 代碼調用非 Java 代碼,其中包括調用 DLL 文件。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/279610.html