Personal Java 程式設計read.pudn.com/downloads74/ebook/266975/pjava_2_tc.pdf ·...

34
1 Personal Java 程式設計() - PocketPC 程式設計 by 王森 Sun Microsystems 教育訓練中心 [email protected] 引言 您想用 Java 來設計手機與 PDA 的應用程式,可是嫌 J2ME MIDP 功能太 少,無法讓您盡情發揮嗎? 筆者建議您試試 Personal JavaPersonal 可以讓 您設計的 Java 程式得以在以 Windows CE Symbian OS 為作業系統的機器 上執行,包括市面上已經可以買到的 PocketPCNokia 9210c SonyEricsson P800 都是 Personal Java 可以發揮的範圍。 前言 本章將介紹如何在 PocketPC 實機上安裝 Personal Java 執行環境,包括 Sun 官方的 Personal Java 執行環境、 Insignia Jeode 。有了 Personal Java 執行環境,我們的 Java 程式就能在 PocketPC 上順利執行。因為 Compaq iPAQ 系列機器都包含了免費的 Jeode 執行環境,所以本文完全使用 Compaq iPAQ 作例子, 為了讓開發流程更專業,本文將介紹一個非常受歡迎的開發工具 - Ant 。有 Ant,我們就能將繁瑣的開發階段自動化。我們將利用 Ant 來開發一個經過 包裝(JAR)與混淆(Obfuscate)Personal Java 應用程式。最終的 JAR 檔是一 個未來只要放置到 PocketPC 上就可以直接在雙擊就能執行的 Java 圖形使用 者介面應用程式。透過此範例,可以讓大家充分體會 Ant 的優異功能,以及 Ant Java 程式設計師所帶來的便利性。 請注意: 本文中出現之 Java 程式碼,已在 Java 2 SDK 1.4.x 完成測試。所使用的 Ant 版本為最新的 1.5 版。本文所有操作皆在 Windows 2000 Professional XP Professional 中文版作業系統上經過測試。如果您使用的是 Windows 其他版 本,我們無法保證會有相同的結果,但基本上應該沒有什麼太大問題。

Transcript of Personal Java 程式設計read.pudn.com/downloads74/ebook/266975/pjava_2_tc.pdf ·...

Page 1: Personal Java 程式設計read.pudn.com/downloads74/ebook/266975/pjava_2_tc.pdf · 包裝(JAR)與混淆(Obfuscate)的Personal Java 應用程式。最終的JAR 檔是一 個未來只要放置到PocketPC

1

Personal Java 程式設計(二) - PocketPC 程式設計

by 王森

Sun Microsystems 教育訓練中心 [email protected]

引言 您想用 Java 來設計手機與 PDA 的應用程式,可是嫌 J2ME MIDP 功能太

少,無法讓您盡情發揮嗎? 筆者建議您試試 Personal Java。Personal 可以讓

您設計的 Java 程式得以在以 Windows CE 與 Symbian OS 為作業系統的機器

上執行,包括市面上已經可以買到的 PocketPC、Nokia 9210c、SonyEricsson P800 都是 Personal Java 可以發揮的範圍。

前言 本章將介紹如何在 PocketPC 實機上安裝 Personal Java 執行環境,包括

Sun 官方的 Personal Java 執行環境、Insignia 的 Jeode。有了 Personal Java執行環境,我們的 Java 程式就能在 PocketPC 上順利執行。因為 Compaq的 iPAQ 系列機器都包含了免費的 Jeode 執行環境,所以本文完全使用

Compaq iPAQ 作例子, 為了讓開發流程更專業,本文將介紹一個非常受歡迎的開發工具 - Ant。有

了 Ant,我們就能將繁瑣的開發階段自動化。我們將利用 Ant 來開發一個經過

包裝(JAR)與混淆(Obfuscate)的 Personal Java 應用程式。最終的 JAR 檔是一

個未來只要放置到 PocketPC 上就可以直接在雙擊就能執行的 Java 圖形使用

者介面應用程式。透過此範例,可以讓大家充分體會 Ant 的優異功能,以及 Ant為 Java 程式設計師所帶來的便利性。

請注意: 本文中出現之 Java 程式碼,已在 Java 2 SDK 1.4.x 完成測試。所使用的 Ant版本為最新的 1.5 版。本文所有操作皆在 Windows 2000 Professional 與 XP Professional 中文版作業系統上經過測試。如果您使用的是 Windows 其他版

本,我們無法保證會有相同的結果,但基本上應該沒有什麼太大問題。

Page 2: Personal Java 程式設計read.pudn.com/downloads74/ebook/266975/pjava_2_tc.pdf · 包裝(JAR)與混淆(Obfuscate)的Personal Java 應用程式。最終的JAR 檔是一 個未來只要放置到PocketPC

2

準備事項 在開始本章之前,請確認安裝了 ActiveSync,並建立 PC 與 PocketPC 之

間的連線。 Tips:初始安裝 在安裝底座之前,請先下載並安裝 ActiveSync,安裝完成後會重新開機,然

後再將底座插入 USB 接口,系統會指示安裝驅動程式,第一次啟動 ActiveSync時,請確認 PocketPC 在開啟狀態,否則系統將搜尋每一個連接阜,如下圖所

示:

即完成安裝程序。 Tips:關於重要目錄 在使用 Personal Java 時,有幾個 PocketPC 的重要目錄,其位置為: 開始功能表 \Windows\「開始」功能表 程式集 \Windows\「開始」功能表\程式集 程式安裝目錄 \Program Files

安裝 Sun 官方 Java 執行環境 請先依照您的機器所使用的 CPU,選擇適當的 Java 執行環境,以

PocketPC 2002 來說,由於使用 StrongARM 處理器,所以會選擇

pjavawince-1_1-beta1-arm.zip。壓縮檔內容如下:

Page 3: Personal Java 程式設計read.pudn.com/downloads74/ebook/266975/pjava_2_tc.pdf · 包裝(JAR)與混淆(Obfuscate)的Personal Java 應用程式。最終的JAR 檔是一 個未來只要放置到PocketPC

3

開啟 ActiveSync,瀏覽 PocketPC 的\Windows\「開始」功能表目錄,

請將 pjavawince.arm.CAB 複製到該目錄。

Page 4: Personal Java 程式設計read.pudn.com/downloads74/ebook/266975/pjava_2_tc.pdf · 包裝(JAR)與混淆(Obfuscate)的Personal Java 應用程式。最終的JAR 檔是一 個未來只要放置到PocketPC

4

完成之後,請點選開始功能表,執行 pjavawince.arm 開始進行安裝。

Page 5: Personal Java 程式設計read.pudn.com/downloads74/ebook/266975/pjava_2_tc.pdf · 包裝(JAR)與混淆(Obfuscate)的Personal Java 應用程式。最終的JAR 檔是一 個未來只要放置到PocketPC

5

完成安裝之後,pjavawince.arm 會自動從開始功能表內移除。並在程式集之

中新增 Java 目錄,

實際上 Java 執行環境安裝在\Program Files\Java 目錄之中, �

Page 6: Personal Java 程式設計read.pudn.com/downloads74/ebook/266975/pjava_2_tc.pdf · 包裝(JAR)與混淆(Obfuscate)的Personal Java 應用程式。最終的JAR 檔是一 個未來只要放置到PocketPC

6

請試著執行範例程式,並熟悉 PocketPC 的操作。

跨平台測試 測試前面文章所製作的範例 測試一: AWT 範例 請將 AWT 版的 Main.class、MyAdapter.class、MyHandler.class 複製到

\Program File\awt 目錄之下。

Page 7: Personal Java 程式設計read.pudn.com/downloads74/ebook/266975/pjava_2_tc.pdf · 包裝(JAR)與混淆(Obfuscate)的Personal Java 應用程式。最終的JAR 檔是一 個未來只要放置到PocketPC

7

點選 Main.class 即可啟動,執行結果如下:

測試二: Swing 範例 請將 Swing 版的 Main.class、MyAdapter.class、MyHandler.class 複製到

\Program File\swing 目錄之下。

Page 8: Personal Java 程式設計read.pudn.com/downloads74/ebook/266975/pjava_2_tc.pdf · 包裝(JAR)與混淆(Obfuscate)的Personal Java 應用程式。最終的JAR 檔是一 個未來只要放置到PocketPC

8

Swingall_fix.jar 則複製到\lib 目錄之下

點選 Main.class 即可啟動,執行結果如下:

Page 9: Personal Java 程式設計read.pudn.com/downloads74/ebook/266975/pjava_2_tc.pdf · 包裝(JAR)與混淆(Obfuscate)的Personal Java 應用程式。最終的JAR 檔是一 個未來只要放置到PocketPC

9

Tips 如果您的程式用到了其他的 JAR 檔或類別檔,我們必須讓類別載入器知道這些

檔案的位置,如此您的程式才能順利執行,可是 PocketPC 不像 PC 那麼方便

輸入命令列指令,在 Sun 官方 Personal Java 執行環境之下,有方法可以解

決這個問題。

方法:修改 Registry

請利用工具將 HKEY_CLASSES_ROOT Java Class File Shell Open Command "\Program Files\Java\bin\pjava.exe" -file "%1"

Page 10: Personal Java 程式設計read.pudn.com/downloads74/ebook/266975/pjava_2_tc.pdf · 包裝(JAR)與混淆(Obfuscate)的Personal Java 應用程式。最終的JAR 檔是一 個未來只要放置到PocketPC

10

裡頭的 "\Program Files\Java\bin\pjava.exe" -file "%1" 改成 "\Program Files\Java\bin\pjava.exe" -classpath "\lib\swingall_fix.jar " -file "%1"

如此一來,Java 的 System Loader 就會到\lib\swingall_fix.jar 目錄之中尋

Page 11: Personal Java 程式設計read.pudn.com/downloads74/ebook/266975/pjava_2_tc.pdf · 包裝(JAR)與混淆(Obfuscate)的Personal Java 應用程式。最終的JAR 檔是一 個未來只要放置到PocketPC

11

找類別檔。 接下來,我們將試著利用 Ant 幫我們完成一個可以在 PocketPC 上執行的 Java應用程式。

使用 Ant 自動化開發流程 Java 編譯器(javac.exe)本身具有類似 make 的能力。也就是說,Java

編譯器可以根據原始碼之中的宣告及型態資訊,配合 import 指令,就可以自動

找出類別檔或原始碼檔來進行編譯工作。這個行為就是所稱的『make 機制』。

底下是一個說明 make 機制的範例:

檔案: Office.java

public class Office{

public static void main(String args[]){

if(args[0].equals("Word")){

Word w = new Word() ;w.print() ;

}else if(args[0].equals("Excel")){

Excel e = new Excel() ;e.print() ;

}}

}

Word.java

Excel.java

編譯器先掃描 Office.java,發現程式中用到了 Word 與 Excel 這兩個類別,所

以會自動去尋找 Word.java 與 Excel.java 來進行編譯。如果 Word.java 與

Excel.java 裡用到其他類別,那麼一樣會遞迴式地自動尋找及編譯。 雖然 Java 編譯器本身有類似 make 的功能,但是仍有力有未逮之處。比

方下面的範例,Java 編譯器本身的 make 能力就無法涵蓋:

Page 12: Personal Java 程式設計read.pudn.com/downloads74/ebook/266975/pjava_2_tc.pdf · 包裝(JAR)與混淆(Obfuscate)的Personal Java 應用程式。最終的JAR 檔是一 個未來只要放置到PocketPC

12

檔案: Office.java

public class Office{

public static void main(String args[]) throws Exception

{Class c = Class.forName(args[0]) ;Object o = c.newInstance() ;Assembly a = (Assembly) o ;a.start() ;

}}

Word.javaExcel.java

Assembly.java

由於我們在程式中用了 Class.forName()方法,而且把其他的功能都抽象地用

Assembly 介面來表示,因此程式碼之中找不到類別之間的相依性,使得您編譯

Office.java 的時候,編譯器只會自動編譯 Assembly.java,卻無法順道編譯

Word.java 及 Excel.java。因為上述的情況,使得 Java 編譯器無法有效編譯

出所有程式執行時所需的類別檔。因此需要有更高階的管理工具來幫助我們。接

下來要介紹的開發工具就是 - Ant,有了 Ant,我們就能讓整個開發程序自動化,

關於 Ant 的介紹與安裝,請參考相關書籍。

自動化開發流程 Personal Java 圖形使用者介面應用程式的開發流程如下圖所示:

Page 13: Personal Java 程式設計read.pudn.com/downloads74/ebook/266975/pjava_2_tc.pdf · 包裝(JAR)與混淆(Obfuscate)的Personal Java 應用程式。最終的JAR 檔是一 個未來只要放置到PocketPC

13

原始碼(.java)原始碼(.java)

類別檔(.class)類別檔(.class) 清單檔

(Manifest.mf)清單檔

(Manifest.mf)

包裹檔(.jar)

包裹檔(.jar)

經過混淆的包裹檔(.jar)

經過混淆的包裹檔(.jar)

javac.exejar.exe jar.exe

混淆器

測試

上圖所表示的是標準 Java 手機程式的開發流程,一開始我們必須撰寫程式

碼(.java 檔),完成之後使用 Java 編譯器(javac.exe)幫我們把原始程式轉換成

二進位的類別檔(.class 檔)。 為了使用者使用上的方便,我們習慣把二進位檔及所有執行時所需的資源

(圖形、音效等)全部包裝成單一一個 JAR 檔。且為了讓我們的圖形使用者介面應

用程式可以直接在 PocketPC 的檔案總管上點選就能執行,我們必須撰寫一個

清單檔(Manifest.mf),清單檔內含一些資訊,這些資訊可以引導執行環境的啟

動器(pjava.exe)自動啟動我們的應用程式。一般而言,我們會利用 JDK 內附的

jar.exe 這個包裝工具幫我們產生 JAR 檔,並且將清單檔塞入 jar 檔內的特定位

置中。 到了這裡,其實已經完成一個的 Java 手機程式專案的所有開發程序了,可

是,Java 的類別檔具有容易反組譯的性質,如果您不希望您的心血結晶被別人

給偷走,我們必須對寫好的程式作混淆(obfuscate)的動作。經過混淆的 Java手機程式,仍然可以正常執行,但是別人想要反組譯就沒那麼容易了。混淆器還

有個不錯的副作用,就是經常會降低程式的大小,這是因為正常的類別檔之中包

含了太多名稱資訊(函式名稱、類別名稱等),經過混淆器混淆之後,由於混淆器

通常會將我們原本的函式呼叫改成沒有意義且比較短的名稱,所以類別檔經過混

淆之後,幾乎都會變小(仍有例外)。對一般 Java 程式設計師來說,可能沒差多

少,但是對於撰寫 Java 手機程式的程式設計師來說,盡力地縮小程式的大小,

是我們夢寐以求的功能,關於更多混淆器的說明,請其他資料。

點選後立刻執行的 JAR 檔 要怎樣讓合成後的 JAR 檔可以在 PocketPC 上點選之後就執行,其實涉及

Page 14: Personal Java 程式設計read.pudn.com/downloads74/ebook/266975/pjava_2_tc.pdf · 包裝(JAR)與混淆(Obfuscate)的Personal Java 應用程式。最終的JAR 檔是一 個未來只要放置到PocketPC

14

了 Windows CE 內部的一些運作機制,我們可以用下圖來表示: 圖: 點選後就執行的 JAR 檔之運作機制

清單檔(Manifest.mf)

清單檔(Manifest.mf)

包裹檔(xyz.jar)包裹檔(xyz.jar)

在螢幕上點選 xyz.jar

取出xyz.jar內部的meta-inf\Manifest.mf

取出Manifest.mf內部的Main-Class: aa.bb屬性

Windows CERegistry

Windows CERegistry

轉換指令pjava –jar xyz.jar

轉換指令pjava –jar xyz.jar

查詢Registry內部對於JAR檔的處理設定

轉換指令pjava –classpath xyz.jar aa.bb

轉換指令pjava –classpath xyz.jar aa.bb

從上圖裡可以發現,位於 meta-ing\Manifest.mf 內部的 Main-Class 屬性

對於整個運作來說非常重要,不過,我們只要撰寫好文字檔,內含 Main-Class屬性,當我們使用 jar.exe 來合成最終的 JAR 檔時,jar.exe 就會自動幫我們把

這個文字檔改名成 manifest.mf,並塞入 JAR 檔內部的 meta-inf 目錄之中。 Tips 一般來說,Main-Class 所指向的類別可以屬於任意套件,存取時只要寫上完

整的全名(套件名.類別名)即可。但是使用 Sun 官方的 Personal Java 執行環

境時,Main-Class 所指向的類別不可以屬於任何套件。 在上圖之中提到一個『查詢 Registry 內部對於 JAR 的設定』的動作,這涉

及 Windows CE 內部的運作方式。Windows CE 內部的 Registry 設定比較不容

易,必須藉助微軟的 Embedded Visual Tools(eVC、eVB)內附的 Windows CE Registry 或其他修改程式才行。 當我們在 PocketPC 上安裝 Personal Java 官方執行環境時,其實安裝工

具已經幫我們建立了.class 與.jar 的關連如下: .class 檔的關聯如下: HKEY_CLASSES_ROOT Java Class File Shell Open Command

Page 15: Personal Java 程式設計read.pudn.com/downloads74/ebook/266975/pjava_2_tc.pdf · 包裝(JAR)與混淆(Obfuscate)的Personal Java 應用程式。最終的JAR 檔是一 個未來只要放置到PocketPC

15

"\Program Files\Java\bin\pjava.exe" -file "%1"

.jar 檔的關聯如下: HKEY_CLASSES_ROOT Java Archive File Shell Open Command "\Program Files\Java\bin\pjava.exe" -file "%1"

Page 16: Personal Java 程式設計read.pudn.com/downloads74/ebook/266975/pjava_2_tc.pdf · 包裝(JAR)與混淆(Obfuscate)的Personal Java 應用程式。最終的JAR 檔是一 個未來只要放置到PocketPC

16

也就是說,當我們點選.class 檔或.jar 檔時,系統都會自動幫我們呼叫 pjava.exe

專案的目錄結構 要使用 Ant 來開發和管理專案,最重要的就是必須先決定專案的目錄結構。

所謂的目錄結構,就是所有專案相關檔案的確切擺放位置,以及整個開發流程的

產出物的擺放位置。有了明確的目錄結構,才知道要如何設計 Ant 所使用建構

檔 build.xml,建構檔的功能就是引導 Ant 幫我們建構整個專案。 就一個 Java 程式專案來說,我們希望所有的原始碼都放置在 src 目錄底

下,而其他的資源檔(如圖片、文字檔、聲音檔、影像檔等)都放置在 res 目錄之

中。建構過程之中所產生的檔案都放置在 build 目錄底下,如果是類別檔,就放

在 build\classes 底下,最後產生的 JAR 檔,就放置在 build\bin 目錄之中。

未精混淆器混淆的 JAR 檔我們取名作”專案名稱-unobfus.jar”(每個軟體專案都

會有不同的專案名稱),而經過混淆器混淆的 JAR 檔,我們命名為” 專案名

稱.jar”。 最後,假設我們的軟體專案包含了三個原始碼檔,一個是 Main.java、

MyAdapte、以及 MyHandler.java。 Main.java

Page 17: Personal Java 程式設計read.pudn.com/downloads74/ebook/266975/pjava_2_tc.pdf · 包裝(JAR)與混淆(Obfuscate)的Personal Java 應用程式。最終的JAR 檔是一 個未來只要放置到PocketPC

17

MyHandler.java

MyAdapter.java

我們也針對點選後即可執行的 JAR 檔,撰寫了 Manifest.mf。 Manifest.mf

Page 18: Personal Java 程式設計read.pudn.com/downloads74/ebook/266975/pjava_2_tc.pdf · 包裝(JAR)與混淆(Obfuscate)的Personal Java 應用程式。最終的JAR 檔是一 個未來只要放置到PocketPC

18

為了未來能夠方便地使用混淆器,我們也把混淆器拷貝到專案的所在目錄中,使

用混淆器時必須要到的 script.rgs 也放置在專案所在目錄裡頭。 script.rgs

因此最初的目錄結構如下所示 圖: 最初的專案目錄結構

專案所在目錄專案所在目錄

src目錄src目錄

Manifest.mfManifest.mfbuild.xmlbuild.xml

build.propertiesbuild.properties

Main.javaMain.java

MyHandler.javaMyHandler.java

retroguard.jarretroguard.jar

script.rgsscript.rgs

res目錄res目錄

pic.jpgpic.jpgMyAdapter.javaMyAdapter.java

Page 19: Personal Java 程式設計read.pudn.com/downloads74/ebook/266975/pjava_2_tc.pdf · 包裝(JAR)與混淆(Obfuscate)的Personal Java 應用程式。最終的JAR 檔是一 個未來只要放置到PocketPC

19

我們希望可以讓整個 Java 程式的建構序比較有彈性,將來不會因為某個目

錄名稱或開發工具有所變動就必須進行修改,我以我們把一些常常會變動的參數

部分獨立放到 build.properties 這個檔案之中,而建構的程序就放到 Ant 的標

準建構檔 build.xml 之中。然後會在 build.xml 引入 build.properties 的所有設

定。 build.properties #此檔用來設定一些常用屬性

#專案名稱

name=MyGUI

#合成後 JAR 的檔名

jar=${name}.jar

#原始檔所在路徑

src.dir=src

#資源檔所在路徑

res.dir=res

#建構產物置放位置

build.dir=build

#編譯後類別檔的放置位置

build.dir.classes=${build.dir}/classes

Page 20: Personal Java 程式設計read.pudn.com/downloads74/ebook/266975/pjava_2_tc.pdf · 包裝(JAR)與混淆(Obfuscate)的Personal Java 應用程式。最終的JAR 檔是一 個未來只要放置到PocketPC

20

#JAR 的最終放置位置

build.dir.bin=${build.dir}/bin

#未經過混淆的 JAR 檔名

build.dir.bin.jarunobfus=${build.dir.bin}/${name}-unobfus.jar

#經過混淆的 JAR 檔名

build.dir.bin.jar=${build.dir.bin}/${jar}

#PJEE 所在路徑

pjee.home=d:/pjee3.1

pjee.home.bin=${pjee.home}/bin

pjee.home.lib=${pjee.home}/lib

pjee.home.lib.boot=${pjee.home.lib}/classes.zip

#混淆器與控制檔

obfuscator.lib=retroguard.jar

obfuscator.script=script.rgs

build.xml <?xml version="1.0" encoding="Big5"?>

<project name="第一個 GUI 程式" default="prepare" basedir=".">

<!-- 引入位於 build.properties 之中的常用屬性 -->

<property file="build.properties"/>

<target name="prepare" description="準備工作">

<mkdir dir="${build.dir}"/>

<mkdir dir="${build.dir.classes}"/>

</target>

<target name="cleandir" description="清除目錄">

<delete dir="${build.dir}"/>

</target>

</project>

有了這些基礎設定之後,我們就可以開始撰寫整個程式建構程序。所有建構

程序都完成之後,專案目錄的結構將如下所示: 圖: 完成整個建構程序之後的專案目錄結構

Page 21: Personal Java 程式設計read.pudn.com/downloads74/ebook/266975/pjava_2_tc.pdf · 包裝(JAR)與混淆(Obfuscate)的Personal Java 應用程式。最終的JAR 檔是一 個未來只要放置到PocketPC

21

專案所在目錄專案所在目錄

src目錄src目錄

res目錄res目錄

Manifest.mfManifest.mfbuild.xmlbuild.xml

build.propertiesbuild.properties

Main.javaMain.java

MyHandler.javaMyHandler.java

retroguard.jarretroguard.jar

script.rgsscript.rgs

build目錄build目錄

bin目錄bin目錄

未混淆的jar檔未混淆的jar檔

classes目錄classes目錄

已混淆的jar檔已混淆的jar檔MyAdapter.javaMyAdapter.java

底下我們將採取漸進的方式,實作建構 Java 程式的每個階段。 編譯

Java 程式建構程序的第一個步驟,就是編譯,所以我們修改 build.xml 如下。 build.xml <?xml version="1.0" encoding="Big5"?>

<project name="第一個 GUI 程式" default="compile" basedir=".">

<!-- 引入位於 build.properties 之中的常用屬性 -->

<property file="build.properties"/>

<target name="prepare" description="準備工作">

<mkdir dir="${build.dir}"/>

<mkdir dir="${build.dir.classes}"/>

</target>

<target name="cleandir" description="清除目錄">

<delete dir="${build.dir}"/>

</target>

<target name="compile" description="編譯原始碼" depends="prepare">

<javac debug="off"

bootclasspath="${pjee.home.lib.boot}"

Page 22: Personal Java 程式設計read.pudn.com/downloads74/ebook/266975/pjava_2_tc.pdf · 包裝(JAR)與混淆(Obfuscate)的Personal Java 應用程式。最終的JAR 檔是一 個未來只要放置到PocketPC

22

srcdir="${src.dir}"

destdir="${build.dir.classes}"

target="1.1"

/>

</target>

</project>

完成修改之後,在目錄下輸入 ant compile 即可開始進行編譯,由於我們在

<project>組件中設定 default=”compile”,所以直接輸入 ant 也可以,ant會自動找到<target name=”compile”>組件,並依照裡面的設定工作。 圖:執行結果

包裝

Java 程式建構程序的第二個步驟是將類別檔與資源檔包裝在一個 JAR 檔之中,

所以我們修改 build.xml 如下: build.xml <?xml version="1.0" encoding="Big5"?>

<project name="第一個 GUI 程式" default="package" basedir=".">

<!-- 引入位於 build.properties 之中的常用屬性 -->

<property file="build.properties"/>

<target name="prepare" description="準備工作">

<mkdir dir="${build.dir}"/>

<mkdir dir="${build.dir.classes}"/>

Page 23: Personal Java 程式設計read.pudn.com/downloads74/ebook/266975/pjava_2_tc.pdf · 包裝(JAR)與混淆(Obfuscate)的Personal Java 應用程式。最終的JAR 檔是一 個未來只要放置到PocketPC

23

</target>

<target name="cleandir" description="清除目錄">

<delete dir="${build.dir}"/>

</target>

<target name="compile" description="編譯原始碼" depends="prepare">

<javac debug="off"

bootclasspath="${pjee.home.lib.boot}"

srcdir="${src.dir}"

destdir="${build.dir.classes}"

target="1.1"

/>

</target>

<target name="package" description="包裝成 JAR 檔" depends="compile">

<mkdir dir="${build.dir.bin}"/>

<jar basedir="${build.dir.classes}"

jarfile="${build.dir.bin.jarunobfus}"

manifest="MANIFEST.MF">

<fileset dir="${res.dir}"/>

</jar>

</target>

</project>

完成修改之後,在目錄下輸入 ant package 即可開始進行打包成 JAR 的工作,

由於我們在<project>組件中設定 default=”package”,所以直接輸入 ant 也可以,ant 會自動找到<target name=”package”>組件,並依照裡面的設定

工作。 圖:執行結果

Page 24: Personal Java 程式設計read.pudn.com/downloads74/ebook/266975/pjava_2_tc.pdf · 包裝(JAR)與混淆(Obfuscate)的Personal Java 應用程式。最終的JAR 檔是一 個未來只要放置到PocketPC

24

混淆

Java 程式建構程序的第三個步驟是混淆,所以我們修改 build.xml 如下。 build.xml <?xml version="1.0" encoding="Big5"?>

<project name="第一個 GUI 程式" default="obfuscate" basedir=".">

<!-- 引入位於 build.properties 之中的常用屬性 -->

<property file="build.properties"/>

<target name="prepare" description="準備工作">

<mkdir dir="${build.dir}"/>

<mkdir dir="${build.dir.classes}"/>

</target>

<target name="cleandir" description="清除目錄">

<delete dir="${build.dir}"/>

</target>

<target name="compile" description="編譯原始碼" depends="prepare">

<javac debug="off"

bootclasspath="${pjee.home.lib.boot}"

srcdir="${src.dir}"

destdir="${build.dir.classes}"

Page 25: Personal Java 程式設計read.pudn.com/downloads74/ebook/266975/pjava_2_tc.pdf · 包裝(JAR)與混淆(Obfuscate)的Personal Java 應用程式。最終的JAR 檔是一 個未來只要放置到PocketPC

25

target="1.1"

/>

</target>

<target name="package" description="包裝成 JAR 檔" depends="compile">

<mkdir dir="${build.dir.bin}"/>

<jar basedir="${build.dir.classes}"

jarfile="${build.dir.bin.jarunobfus}"

manifest="MANIFEST.MF">

<fileset dir="${res.dir}"/>

</jar>

</target>

<target name="obfuscate" description="使用混淆器" depends="package">

<java fork="yes" classname="RetroGuard" classpath="${obfuscator.lib}">

<arg line="${build.dir.bin.jarunobfus}"/>

<arg line="${build.dir.bin.jar}"/>

<arg line="${obfuscator.script}"/>

</java>

</target>

</project>

完成修改之後,在目錄下輸入 ant obfuscate 即可開始進行混淆的工作,由於

我們在<project>組件中設定 default=”obfuscate”,所以直接輸入 ant 也可

以,ant 會自動找到<target name=”obfuscate”>組件,並依照裡面的設定工

作。 圖:執行結果

Page 26: Personal Java 程式設計read.pudn.com/downloads74/ebook/266975/pjava_2_tc.pdf · 包裝(JAR)與混淆(Obfuscate)的Personal Java 應用程式。最終的JAR 檔是一 個未來只要放置到PocketPC

26

一次搞定

所有的步驟要一一輸入指令仍嫌太麻煩,我們希望 Ant 幫我們把所有建構

步驟連同喚起模擬器一次搞定,所以請修改 build.xml 如下: build.xml <?xml version="1.0" encoding="Big5"?>

<project name="第一個 GUI 程式" default="all" basedir=".">

<!-- 引入位於 build.properties 之中的常用屬性 -->

<property file="build.properties"/>

<target name="prepare" description="準備工作">

<mkdir dir="${build.dir}"/>

<mkdir dir="${build.dir.classes}"/>

</target>

<target name="cleandir" description="清除目錄">

<delete dir="${build.dir}"/>

</target>

<target name="compile" description="編譯原始碼" depends="prepare">

<javac debug="off"

bootclasspath="${pjee.home.lib.boot}"

Page 27: Personal Java 程式設計read.pudn.com/downloads74/ebook/266975/pjava_2_tc.pdf · 包裝(JAR)與混淆(Obfuscate)的Personal Java 應用程式。最終的JAR 檔是一 個未來只要放置到PocketPC

27

srcdir="${src.dir}"

destdir="${build.dir.classes}"

target="1.1"

/>

</target>

<target name="package" description="包裝成 JAR 檔" depends="compile">

<mkdir dir="${build.dir.bin}"/>

<jar basedir="${build.dir.classes}"

jarfile="${build.dir.bin.jarunobfus}"

manifest="MANIFEST.MF">

<fileset dir="${res.dir}"/>

</jar>

</target>

<target name="obfuscate" description="使用混淆器" depends="package">

<java fork="yes" classname="RetroGuard" classpath="${obfuscator.lib}">

<arg line="${build.dir.bin.jarunobfus}"/>

<arg line="${build.dir.bin.jar}"/>

<arg line="${obfuscator.script}"/>

</java>

</target>

<target name="all" description="完成所有程序" depends="cleandir,obfuscate" />

</project>

完成之後,以後我們只要在目錄下輸入 ant 或 ant all 就可以輕鬆讓 Ant 幫我們

自動清除前一次的建構結果,然後從頭到尾再幫我們建構整個專案。 圖:執行結果

Page 28: Personal Java 程式設計read.pudn.com/downloads74/ebook/266975/pjava_2_tc.pdf · 包裝(JAR)與混淆(Obfuscate)的Personal Java 應用程式。最終的JAR 檔是一 個未來只要放置到PocketPC

28

最後,請將 MyGUI.jar 放置到 PocketPC 上,點選 MyGUI.jar,程式就會自動

執行。

安裝 Jeode 執行環境 請 確 認 ActiveSync 啟 動 , 請 iPAQ 放 置 在 底 座 上 , 執 行

JEODEFORIPAQ.EXE 即可開始安裝程序。安裝程式會幫我們安裝 Pocket IE 的

Plug-in,讓我們可以觀看有 Applet 的網頁。也會安裝一個 Personal Java 執

行環境。 預設情況下,安裝程式會在 PocketPC 的\Windows 目錄下安裝

evm.exe,並在\Windows\lib 目錄下安裝其他相關的檔案。

您也可以選擇不要安裝在預設的位置,只要上述畫面時選擇”否”即可。

Page 29: Personal Java 程式設計read.pudn.com/downloads74/ebook/266975/pjava_2_tc.pdf · 包裝(JAR)與混淆(Obfuscate)的Personal Java 應用程式。最終的JAR 檔是一 個未來只要放置到PocketPC

29

安裝畫面:

Jeode 的安裝程式會在 C:\Program Files 底下建立暫存目錄,請重新執行

JEODEFORIPAQ.EXE 就可以刪掉此安裝目錄。

使用 Jeode 執行環境 請到程式集之中,選擇 Jeode 目錄

Page 30: Personal Java 程式設計read.pudn.com/downloads74/ebook/266975/pjava_2_tc.pdf · 包裝(JAR)與混淆(Obfuscate)的Personal Java 應用程式。最終的JAR 檔是一 個未來只要放置到PocketPC

30

點選 EVM,

輸入 -cp “Program Files\awt” Main 然後選擇底下的鍵盤

Page 31: Personal Java 程式設計read.pudn.com/downloads74/ebook/266975/pjava_2_tc.pdf · 包裝(JAR)與混淆(Obfuscate)的Personal Java 應用程式。最終的JAR 檔是一 個未來只要放置到PocketPC

31

點選 Enter 鍵之後就可以啟動程式。

如果要啟動 Swing 版的程式,請使用 -cp \lib\swingall_fix.jar;“Program Files\swing” Main 執行結果

Page 32: Personal Java 程式設計read.pudn.com/downloads74/ebook/266975/pjava_2_tc.pdf · 包裝(JAR)與混淆(Obfuscate)的Personal Java 應用程式。最終的JAR 檔是一 個未來只要放置到PocketPC

32

製作 Jeode 執行環境啟動捷徑 請到\Windows 目錄底下找到 evm.exe,點選觸控筆不放,選擇”複製”。

到任何您覺得合適的地方,選擇”編輯 | 貼上捷徑”,

Page 33: Personal Java 程式設計read.pudn.com/downloads74/ebook/266975/pjava_2_tc.pdf · 包裝(JAR)與混淆(Obfuscate)的Personal Java 應用程式。最終的JAR 檔是一 個未來只要放置到PocketPC

33

將此捷徑複製到 PC 上,變更檔名為 MyApp.lnk,並將其內容修改為

將 MyApp.lnk 放回 PocketPC 上,只要點選此捷徑,就能夠自動啟動 Jeode,並執行我們的程式。 Tips 由於.lnk 檔在 Windows 之中有特殊意義,要修改其內容,我們必須先啟動文

字編輯器,然後再開啟.lnk 檔。 Tips 當我們在 iPAQ 上攔截鍵盤事件時,機器上的按鈕及其對應的 key code 如下: 十字鈕上面四顆按鈕 193 , 194 , 195 , 196 十字鈕-上 38 十字鈕-下 40 十字鈕-左 37 十字鈕-右 39 十字鈕-中 134

Page 34: Personal Java 程式設計read.pudn.com/downloads74/ebook/266975/pjava_2_tc.pdf · 包裝(JAR)與混淆(Obfuscate)的Personal Java 應用程式。最終的JAR 檔是一 個未來只要放置到PocketPC

34

結語 本文為大家介紹了如何在 PocketPC 實機上開發 Java 程式,並全程以

Compaq iPAQ 做範例。感受到 Java 跨平台特性的您,是不是覺得很感動呢? 從下次開始,筆者會將焦點轉移到 Symbian OS 上,告訴大家該如何開發 Nokia 9210c 與 SonyEricsson P800 上頭的 Java 應用程式,咱們下次見。