国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開(kāi)發(fā)設(shè)計(jì) > 正文

創(chuàng)建本機(jī)、跨平臺(tái) GUI 應(yīng)用程序

2019-11-18 15:06:53
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

java 語(yǔ)言在服務(wù)器端和 applet 領(lǐng)域已經(jīng)大行其道,但是對(duì)于最終用戶應(yīng)用程序,通常它不是主角。其實(shí)不一定會(huì)是這種情況。使用 linux、用于 Java 的 GNU 編譯器(GNU Compiler for Java)和標(biāo)準(zhǔn)窗口構(gòu)件工具箱(Standard Widget Toolkit),您可以創(chuàng)建用 Java 語(yǔ)言編寫的快速、本機(jī) GUI 應(yīng)用程序。(Windows 版本的也不遠(yuǎn)了。)經(jīng)驗(yàn)豐富的 Java 開(kāi)發(fā)人員 Kirk Vogen 說(shuō)明了如何做到這一步。通過(guò)單擊本文頂部或底部的討論在論壇中將您對(duì)本文的想法與作者和其他讀者一起分享。
眾所周知,Java 語(yǔ)言在服務(wù)器上以及 applet 領(lǐng)域已經(jīng)非常成功了,但是它在最終用戶應(yīng)用程序領(lǐng)域?yàn)槭裁礇](méi)有大行其道呢?有幾個(gè)原因。首先,即使很小的應(yīng)用程序的內(nèi)存占用通常也有好幾兆字節(jié)。第二,與 Java 語(yǔ)言一起提供的 GUI 庫(kù)產(chǎn)生的應(yīng)用程序通常看起來(lái)與其本機(jī)同類應(yīng)用程序不同。因此,無(wú)論您的應(yīng)用程序多么健壯或穩(wěn)定,與本機(jī)應(yīng)用程序相比,它都顯得非常笨拙。

用于 Java 的 GNU 編譯器
讓我們從內(nèi)存占用問(wèn)題開(kāi)始。Java 應(yīng)用程序要使用額外的內(nèi)存,因?yàn)檫\(yùn)行 Java 字節(jié)碼時(shí),虛擬機(jī)必須完成許多“工作”。在當(dāng)今高級(jí)編譯器中,編譯即時(shí)(just-in-time)發(fā)生并且編譯器必須對(duì)這一信息立即(on-the-fly)進(jìn)行高速緩存以供以后使用。當(dāng)然,現(xiàn)在內(nèi)存是便宜,但是當(dāng)有幾個(gè) Java 應(yīng)用程序同時(shí)在一臺(tái)機(jī)器上運(yùn)行時(shí),即使是大機(jī)器也可能由于持續(xù)的內(nèi)存頁(yè)面調(diào)度而放慢速度。進(jìn)入用于 Java 的 GNU 編譯器(GCJ)。GCJ 獲得 Java 源代碼或字節(jié)碼,然后將它們編譯成本機(jī)機(jī)器代碼。然后,可以將來(lái)自幾個(gè) Java 類的機(jī)器代碼鏈接在一起成為單個(gè)本機(jī)應(yīng)用程序。

一月份,Martyn Honeyford 為我們提供了本機(jī)編譯和 GCJ 的簡(jiǎn)介(請(qǐng)參閱參考資料以獲取到 Martyn 文章的鏈接)。正如他通過(guò)示例向我們展示的那樣,本機(jī)編譯的應(yīng)用程序使用的內(nèi)存通常要比在虛擬機(jī)中運(yùn)行的應(yīng)用程序要少得多。

標(biāo)準(zhǔn)窗口構(gòu)件工具箱
這很棒,但是正如 Martyn 指出的,GCJ 尚不支持 AWT 或 Swing。因此,我們現(xiàn)在將如何建立本機(jī)編譯的 GUI 應(yīng)用程序呢?進(jìn)入標(biāo)準(zhǔn)窗口構(gòu)件工具箱(SWT)。這一 API 是開(kāi)放源碼 Eclipse 工具平臺(tái)的一部分。為了避免引起 Swing 與 SWT 的對(duì)抗(請(qǐng)參閱參考資料以獲取關(guān)于這場(chǎng)爭(zhēng)論的更多具體信息),讓我說(shuō)明一些 SWT 的優(yōu)勢(shì)。

SWT 試圖彌補(bǔ) AWT 和 Swing 的缺點(diǎn)。使用 AWT,我們將受到“最小公分母”限制:僅支持存在于所有平臺(tái)上的窗口構(gòu)件。因?yàn)?Motif 沒(méi)有提供本機(jī)樹型窗口構(gòu)件而 Windows 提供了該功能,AWT 就沒(méi)有包含樹型窗口構(gòu)件。

Windows 上的 GCJ

Windows 上的 GCJ 還未實(shí)現(xiàn)。由于 GCJ 中存在一個(gè)涉及與場(chǎng)合無(wú)關(guān)的文件系統(tǒng)(例如,F(xiàn)AT 和 NTFS)的錯(cuò)誤,GCJ 目前還不能在 Windows 上運(yùn)行。但是,在 GCJ 3.1 中接下來(lái)最好的一件事應(yīng)該出現(xiàn)。使用 Linux,您將能把 GCJ 設(shè)置成交叉編譯器,它將答應(yīng)您在 Linux 上編譯代碼而生成 Windows 二進(jìn)制文件。GCJ 3.1 是針對(duì) 2002 年 4 月 15 日的發(fā)行版。請(qǐng)參閱 GCJ 主頁(yè)和郵件列表(在參考資料中提及的)以獲取最新的發(fā)展。

Swing 走向了另一個(gè)極端。雖然帶有一個(gè)很出色的 API 進(jìn)行優(yōu)雅地設(shè)計(jì),Swing 還是自己實(shí)現(xiàn)窗口構(gòu)件。因此 Swing 不依靠于操作系統(tǒng)提供窗口構(gòu)件。無(wú)論本機(jī)是否支持,這都為 Swing 提供了不可思議的靈活性。但是,因?yàn)?Swing 自己繪制這些窗口構(gòu)件,所以最終的外觀看起來(lái)與本機(jī)應(yīng)用程序有明顯的不同。

SWT 試圖彌合這兩個(gè) GUI 工具箱之間的差距。它的行軍命令是:“假如有本機(jī)窗口構(gòu)件就使用它。假如沒(méi)有,就模擬它。”前面提到的樹型窗口構(gòu)件就是這樣一個(gè)示例。因?yàn)?Windows 支持本機(jī)樹型窗口構(gòu)件,所以在 Windows 上運(yùn)行時(shí),SWT 就使用它。但是,Motif 不支持樹型窗口構(gòu)件,因此 SWT 在 Motif 下運(yùn)行時(shí)繪制其自己的窗口構(gòu)件版本。使用 SWT,結(jié)果應(yīng)用程序看起來(lái)與其本機(jī)的同類應(yīng)用程序很相似,因?yàn)楸M可能地使用了本機(jī)窗口構(gòu)件。

設(shè)置開(kāi)發(fā)環(huán)境
因此,如何在本機(jī)編譯所有這些應(yīng)用程序呢?首先,您需要一個(gè)使用 GCJ 設(shè)置的開(kāi)發(fā)環(huán)境。目前,在 Linux 和其它 UNIX 變體(請(qǐng)參閱“Windows 上的 GCJ”側(cè)欄以了解 GCJ 在 Windows 上的情況)上支持 GCJ。設(shè)置開(kāi)發(fā)環(huán)境的最簡(jiǎn)便方法是安裝一種 Linux 分發(fā)版的新近版本。Mandrake 8.1 和 Red Hat 7.2 都帶有需另外安裝的 GCJ 3.0.1。因?yàn)?GCJ 仍然在發(fā)展,所以可能想考慮使用最新和最好的版本。我選擇在版本 3.0.3 和 3.0.4 上進(jìn)行測(cè)試。手工安裝 GCJ 相對(duì)輕易;GCJ 頁(yè)面提供了相當(dāng)好的文檔(請(qǐng)參閱參考資料)。

一旦有了一個(gè)具有 GCJ 的環(huán)境,則下載 Eclipse SDK 并安裝它。這將為您提供 SWT 源代碼和字節(jié)碼。要安裝 Eclipse SDK,請(qǐng)下載 ZIP 文件(在 Eclipse SDK 標(biāo)題下),然后將它解壓縮到一個(gè)目錄中。我建議使用目錄 /usr/local/eclipse,但是任何目錄都可以。

開(kāi)始編譯
設(shè)置開(kāi)發(fā)環(huán)境后,就可以開(kāi)始編譯了。編譯應(yīng)用程序包括對(duì)大多數(shù) SWT 源代碼執(zhí)行與下面類似的命令:

gcj -c MyClass.java -o MyClass.o

大約有 30 個(gè) SWT 源文件使用 Java 本機(jī)接口(Java Native Interface (JNI)),因此我們需要以略微不同的方式來(lái)編譯它們(請(qǐng)注重 -fjni 標(biāo)記):

gcj -fjni -c MyJNIClass.java -o MyJNIClass.o

最后,我們需要將結(jié)果對(duì)象編譯成共享對(duì)象:

gcj -shared -o swt.so MyClass.o MyJNIClass.o ...

構(gòu)建 SWT
在本文中,我們將把 SWT 編譯成共享對(duì)象,然后在產(chǎn)生的應(yīng)用程序中動(dòng)態(tài)引用這個(gè)對(duì)象。請(qǐng)注重,您可以使用應(yīng)用程序代碼將 SWT 編譯成可執(zhí)行文件,但是基于本文所討論的范圍,我們將堅(jiān)持編譯成共享對(duì)象。正如它的名稱所表明的,共享對(duì)象的主要優(yōu)點(diǎn)就是可以被共享。在運(yùn)行時(shí)所有應(yīng)用程序都可以動(dòng)態(tài)地使用同一個(gè)對(duì)象。產(chǎn)生的可執(zhí)行文件大小將小得多。

使用下載源代碼中包含的 Ant 構(gòu)建文件(buildfile),我們將以自動(dòng)方式編譯 SWT。這個(gè)文件完成兩個(gè)主要任務(wù)。首先,它將幾個(gè)補(bǔ)丁程序應(yīng)用到 SWT 源代碼。(SWT 文件中有三個(gè)將不能用 GCJ 進(jìn)行編譯,這是因?yàn)橐恍┬〉木幾g器錯(cuò)誤造成的 ? 例如,它不喜歡 int x, y, x1, y1 作為一行;必須將它們分成多行。在這些情況下,為這三個(gè)源文件編寫了小的補(bǔ)丁程序以使它們?cè)诠δ苌系葍r(jià)。正如我以前提到的,GCJ 仍然在發(fā)展;這些錯(cuò)誤會(huì)逐漸消除。)其次,構(gòu)建文件使用提供的制作文件(makefile)來(lái)調(diào)用 make。

在清單 1 中顯示的 Ant 構(gòu)建文件已經(jīng)在 Ant 1.3 和 Ant 1.4.1 上測(cè)試過(guò)了。請(qǐng)注重,在清單中我除去了注釋以節(jié)省空間,但是有完整的代碼可供下載。

要運(yùn)行構(gòu)建,請(qǐng)遵循下列步驟:

安裝 Ant(請(qǐng)參閱參考資料以獲取關(guān)于 Ant 的更多信息)。

下載本文的源文件,它包含構(gòu)建文件、補(bǔ)丁程序和關(guān)聯(lián)的制作文件,然后將它解壓縮到一個(gè)目錄中。

導(dǎo)航至 SWT 目錄,然后輸入 ant。構(gòu)建文件假設(shè)您已經(jīng)在 usr/local/eclipse 中安裝了 Eclipse。假如 Eclipse 安裝在另一個(gè)目錄中,請(qǐng)輸入 ant -Declipse_install_dir=your_Directory,其中 your_directory 是您安裝 Eclipse 的目錄。
注:假如不想使用 Ant 構(gòu)建文件,您可以手工解壓縮 SWT 源文件和字節(jié)碼,然后使用 UNIX patch 命令來(lái)應(yīng)用源代碼中包含的那三個(gè)補(bǔ)丁程序(使用 .patch 文件)。然后,運(yùn)行制作文件。

清單 1. Ant 構(gòu)建文件
<PRoject name="BuildEclipse" default="cleanup">

<!--
The following properties can be overridden at the command-line.

e.g. ant -Declipse_install_dir=/usr/local/eclipse
-->
<property name="eclipse_install_dir" value="/usr/local/eclipse"/>
<property name="temp_dir" value="build_temp"/>
<property name="shared_object_name" value="swt.so"/>

<target name="init">
<mkdir dir="${temp_dir}"/>
</target>

<target name="unpack" depends="init">
<unzip src="${eclipse_install_dir}/plugins/org.eclipse.swt/swtsrc.zip"
dest="${temp_dir}"/>
<unjar src="${eclipse_install_dir}/plugins/org.eclipse.swt/swt.jar"
dest="${temp_dir}"/>
</target>

<target name="patch" depends="unpack">
<patch patchfile="TabFolder.patch"
originalfile="${temp_dir}/org/eclipse/swt/widgets/TabFolder.java"/>
<patch patchfile="Widget.patch"
originalfile="${temp_dir}/org/eclipse/swt/widgets/Widget.java"/>
<patch patchfile="TreeEditor.patch"/>
<move file="TreeEditor.java" todir="${temp_dir}/org/eclipse/swt/custom"/>
</target>

<target name="make" depends="patch">
<execon executable="toUCh">
<fileset dir="${temp_dir}" includes="**/*.java" excludes="**/*.class"/>
</execon>
<execon executable="touch">
<fileset dir="${temp_dir}" includes="**/*.class" excludes="**/*.java"/>
</execon>
<copy file="Makefile" todir="${temp_dir}"/>
<exec executable="make" dir="${temp_dir}">
<arg line="-f Makefile"/>
</exec>
</target>

<target name="cleanup" depends="make">
<move file="${temp_dir}/${shared_object_name}" todir="."/>
<delete dir="${temp_dir}"/>
</target>

</project>

創(chuàng)建應(yīng)用程序
既然您已經(jīng)將 SWT 構(gòu)建到共享對(duì)象中,您就可以嘗試樣本應(yīng)用程序。顯示在清單 2 中的應(yīng)用程序由一個(gè)顯示經(jīng)典“Hello, World!”消息的簡(jiǎn)單窗口組成。

清單 2.“Hello, World”樣本應(yīng)用程序
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.RowLayout;

public class Hello {

public static void main(String[] args) {
Display display = new Display();
final Shell shell = new Shell(display);
RowLayout layout = new RowLayout();
layout.justify = true;
layout.pack = true;
shell.setLayout(layout);
shell.setText("Hello, World!");
Label label = new Label(shell, SWT.CENTER);
label.setText("Hello, World!");
shell.pack();
shell.open ();
while (!shell.isDisposed()) {
if (!display.readAndDispatch()) display.sleep ();
}
display.dispose ()

要編譯這個(gè)應(yīng)用程序,請(qǐng)遵循下列步驟:

將 SWT 共享對(duì)象(swt.so)復(fù)制到 Hello World 目錄中,然后輸入下列命令。(請(qǐng)記住,假如在 /usr/local/eclipse 以外的目錄中安裝了 Eclipse SDK,請(qǐng)用您的目錄來(lái)替換它。)

gcj -CLASSPATH=/usr/local/eclipse/plugins/org.eclipse.swt/swt.jar
-c Hello.java -o Hello.o

gcj -main=Hello -o Hello Hello.o swt.so

接下來(lái),使用下列命令設(shè)置庫(kù)路徑(假設(shè)您正在使用 bash shell):

eXPort LD_LIBRARY_PATH=
.:/usr/local/eclipse:/usr/local/eclipse/plugins/org.eclipse.swt/ws/motif

輸入 ./Hello,會(huì)看到本機(jī)編譯的 GUI Java 應(yīng)用程序出現(xiàn)屏幕上!
注:本文的源代碼包括使這一過(guò)程自動(dòng)化的制作文件。

展望
對(duì) Windows 應(yīng)用程序的編譯很快就可以實(shí)現(xiàn)了(請(qǐng)參閱 Windows 上的 GCJ 側(cè)欄),雖然目前僅在 Linux/Motif 和 Windows 上支持 SWT,但正在進(jìn)行積極的開(kāi)發(fā)以在 Linux 上將 SWT 移植到 GTK/GNOME。SWT 還可以在 AIX 和 Solaris 上的 Motif 下工作,但是還未經(jīng)全面測(cè)試。最后,在 Windows CE、QNX 和 Macintosh 移植上已經(jīng)完成了一些工作,但是目前主要的側(cè)重點(diǎn)還是針對(duì)其它平臺(tái)。要查看各種 SWT 移植的進(jìn)展,請(qǐng)參閱參考資料。

結(jié)束語(yǔ)
眾所周知,Java 語(yǔ)言具有一些重要的特性。它是優(yōu)雅的,提供了面向?qū)ο蟾拍畹某錾珜?shí)現(xiàn),并且具有一個(gè)非常有用的標(biāo)準(zhǔn)類庫(kù)。將這些優(yōu)點(diǎn)與 GCJ 和 SWT 相結(jié)合使 Java 語(yǔ)言定位成在服務(wù)器和 Web 瀏覽器上建立其基礎(chǔ),然后轉(zhuǎn)向最終用戶應(yīng)用程序領(lǐng)域。

參考資料

請(qǐng)通過(guò)單擊本文頂部或底部的討論來(lái)參與本文的論壇。

下載本文的源代碼和相關(guān)文件。

下載 Eclipse SDK 以獲取 SWT 庫(kù)。此外,請(qǐng)查閱將 SWT 移植到其它平臺(tái)的進(jìn)展。

了解 Ant,并下載最新的發(fā)行版 Ant 1.4.1 以使您的構(gòu)建自動(dòng)化。

假如您想知道關(guān)于 Ant 的更多背景知識(shí),這些 developerWorks 文章會(huì)對(duì)您有所幫助:
Malcolm Davis 寫的“Incremental development with Ant and JUnit”(2000 年 11 月)
Erik Hatcher 寫的“Automating the build and test process”(2001 年 8 月)
Anthony Young-Garner 寫的“Extending Ant to support interactive builds”(2001 年 11 月)

閱讀一篇關(guān)于 SWT 的介紹性文章或者瀏覽 eclipse.org 文章頁(yè)面上的其它 SWT 文章。

查看正在對(duì) SWT 和 Swing 之間區(qū)別展開(kāi)的討論。

在 GCJ 頁(yè)面找到關(guān)于 GCJ 的更多信息。通過(guò)密切關(guān)注 GCJ 郵件列表以及 GCJ 補(bǔ)丁程序郵件列表,獲得最新信息。

通過(guò)遵循 GCJ 構(gòu)建指示構(gòu)建您自己的 GCJ;在 GCJ 鏡象站點(diǎn)頁(yè)面上通過(guò)文件 gcc-3.0.4.tar.gz 下載源代碼。

請(qǐng)閱讀 Martyn Honeyford 的文章“Weighing in on Java native compilation”(developerWorks,2002 年 1 月)以獲取關(guān)于 Java 本機(jī)編譯的更多信息。

在 developerWorks Java 技術(shù)專區(qū)中可以找到其它有關(guān) Java 的文章。

--摘自IBM網(wǎng)站
http://www-900.ibm.com/developerWorks/cn/linux/guitoolkit/j-nativegui/index.sHtml

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 大邑县| 连城县| 石嘴山市| 宁海县| 宿州市| 靖州| 萍乡市| 鸡东县| 巫溪县| 山阴县| 铜陵市| 原平市| 杂多县| 双城市| 贵州省| 桃园县| 吴忠市| 龙胜| 临洮县| 沙坪坝区| 陆河县| 津南区| 福贡县| 永修县| 平塘县| 武城县| 贡嘎县| 宁德市| 大足县| 祁东县| 台湾省| 遵化市| 中牟县| 蕉岭县| 商河县| 阳城县| 峡江县| 宁蒗| 滕州市| 罗定市| 同仁县|