下面這段話摘自 JDK1.3 的某個頭文件,它說明了這種新的 API 的開發背景及原因:
AWT 支持使用本地 C 或 C++ 應用程序訪問 AWT 的本地結構。這是為了便于將原有的 C 或 C++ 應用程序移植到 Java 并滿足需要 ... [這些應用程序] 出于性能方面的原因在畫布上自行進行本地繪制
在 JDK1.3 以前,Java 編程沒有明確的方法來訪問基層的同等 GUI 組件的句柄。在 JDK 1.3 中, Sun 公司創建了一種標準機制,通過這種機制,開發人員可以使本地 GUI 應用程序和庫在 Java AWT Canvas
對象中進行繪制。這意味著現在有一種正式的、有保證的方法來獲得支持這一功能的信息。當 JDK 1.3 與其他操作平臺對接時,所有的接口都提供相同的信息 -- 而不管使用的是什么系統。JDK 1.3 的 Windows 版本和 Solaris 版本是首先提供這種支持的實現。
Sun 公司引入這一功能組件有幾方面的原因。首先, JDK 1.3 使得人們可以將依靠第三方產品的復雜原有軟件移植到 Java 上,而不必等到第三方產品本身完成移植以后。第二個原因即性能;假如本地的 GUI 代碼經過人們長時期的努力得到優化,則原樣保留這些軟件具有重要的商業價值。
在本文中,我將介紹一些該功能部件的基本概念。我將逐步開發一個窗口小部件樣例,該窗口小部件使用Win32 API 進行繪制。下圖是最終的窗口小部件的快照,一個帶有笑臉的圓形窗口。
分步概覽
第一步,定義一個 Java 類 -- 比如說,Mywindow
-- 使其繼續 Canvas
類并重載 paint
方法。您使用 paint
方法執行 AWT 對象的繪制操作,并在覆蓋該方法時加上 native
要害字。覆蓋方法使您能夠使用自己的本地代碼。您必須構建自己的本地代碼并把它編譯成一個動態連接庫,就像我們處理其他的 Java 本地接口應用程序一樣,在本例中,我們將調用 MyWindow.DLL
庫。在 Solaris 和 linux 上則為共享對象或共享庫。您還需要用 System.loadLibrary("MyWindow")
調用將 MyWindow.DLL 庫加載到您的名為 MyWindow
的 Java 類中。
完成這一示例需要二個部分:其一是 MyWindow.Java
,它提供 Canvas
類的子類,其二是 MyWindow.CPP
,它包含基于 Java 本地接口的繪制子程序的入口點。 在參考資源部分可找到 MyWindow.Java
、MyWindow.CPP
及自動執行編譯的批處理文件 BUILD.BAT
。
第一步: 創建 MyWindow Java 類
J2AWT 用于這種方法時有一個主要的局限性:本地代碼只能對 java.awt.Canvas
類的子類進行操作。這正是 MyWindow
繼續 Canvas
類的原因。在 Java 應用程序中,您可以像使用 Canvas
的其它子類那樣使用 MyWindow
;在本例中,我將 MyWindow
添加到 Jwindow
中。
import java.awt.*;
import javax.swing.*;
public class MyWindow extends Canvas {
static {
//加載包含 paint 代碼的庫。
System.loadLibrary("MyWindow");
}
//繪制操作的本地入口點
public native void paint(Graphics g);
public static void main( String[] argv ){
Frame f = new Frame();
f.setSize(300,400);
JWindow w = new JWindow(f);
w.setBackground(new Color(0,0,0,255));
w.getContentPane().setBackground(new Color(0,0,0,255));
w.getContentPane().add(new MyWindow());
w.setBounds(300,300,300,300);
w.setVisible(true);
}
}
新聞熱點
疑難解答