Java 程序可以“一次編寫(xiě),到處運(yùn)行”,原因是它運(yùn)行在 Ja va 虛擬機(jī)上。
正是由于這個(gè)原因,它的執(zhí)行效率也會(huì)相應(yīng)打些折扣,特別是一些與操作系統(tǒng)連接比較緊密的操作。
所以 Java 也提供了本地接口,以便直接調(diào)用其它更高效的程序接口,例如 C 、C ++ 等等。
MinGW 是一個(gè)運(yùn)行在 Windows 平臺(tái)的 C 、C ++ 編譯器,支持 Make 、Gdb 等類(lèi)似 Linux 環(huán)境下 GCC 的功能。
下面演示一下用 MinGW 將 C 程序編譯成動(dòng)態(tài)鏈接庫(kù),再使用 Java 的本地方法調(diào)用 C 程序中的函數(shù)。TP-LINK路由器帶MODEM功能嗎
1、創(chuàng)建 Java 類(lèi)文件并聲明本地接口
正是由于這個(gè)原因,它的執(zhí)行效率也會(huì)相應(yīng)打些折扣,特別是一些與操作系統(tǒng)連接比較緊密的操作。
所以 Java 也提供了本地接口,以便直接調(diào)用其它更高效的程序接口,例如 C 、C ++ 等等。
MinGW 是一個(gè)運(yùn)行在 Windows 平臺(tái)的 C 、C ++ 編譯器,支持 Make 、Gdb 等類(lèi)似 Linux 環(huán)境下 GCC 的功能。
下面演示一下用 MinGW 將 C 程序編譯成動(dòng)態(tài)鏈接庫(kù),再使用 Java 的本地方法調(diào)用 C 程序中的函數(shù)。TP-LINK路由器帶MODEM功能嗎
1、創(chuàng)建 Java 類(lèi)文件并聲明本地接口
package testnative; //未定義包名會(huì)調(diào)用時(shí)會(huì)出現(xiàn) java.lang.UnsatisfiedLinkError
public class CheckFile {
static {// 動(dòng)態(tài)庫(kù)名稱為 test.dll
System.loadLibrary("test");
}
// 本地方法名稱
public native void printHello();
public static void main(String[] args) {
try {// 測(cè)試運(yùn)行
new CheckFile().printHello();
} catch (Exception e) {
e.printStackTrace();
}
}
}
public class CheckFile {
static {// 動(dòng)態(tài)庫(kù)名稱為 test.dll
System.loadLibrary("test");
}
// 本地方法名稱
public native void printHello();
public static void main(String[] args) {
try {// 測(cè)試運(yùn)行
new CheckFile().printHello();
} catch (Exception e) {
e.printStackTrace();
}
}
}
2、根據(jù) CheckFile 自動(dòng)生成 C ++ 頭文件 testnative_CheckFile.h
> javah -classpath . -jni testnative.CheckFile
3、根據(jù)頭文件 testnative_CheckFile.h 編寫(xiě) C ++ 程序
> javah -classpath . -jni testnative.CheckFile
3、根據(jù)頭文件 testnative_CheckFile.h 編寫(xiě) C ++ 程序
4、編譯 C ++ 程序?yàn)閯?dòng)態(tài)鏈接庫(kù) test.dll
注意 JDK 的路徑
> g++ -ID:\tools\jdk1.6.0_16\include -ID:\tools\jdk1.6.0_16\include\win32 -fPIC -Wall -g -c CheckFile.cpp
生成 CheckFile.o 文件后,再生成動(dòng)態(tài)鏈接庫(kù) test.dll
> g++ -shared -Wl,--kill-at -o test.dll CheckFile.o
5、測(cè)試執(zhí)行
> java -Djava.library.path=. -cp . testnative.CheckFile