本系列第 1 部分 向您介紹了 OpenCable Application Platform (OCAP) — 針對交互式有線電視應用程序的平台 — 和 OCAP Reference Implementation (RI)。您已經了解到,OCAP 的結構基於 3 個規范,這些規范是標准 Java ME 技術的一部分:
Connected Device Configuration (CDC) 描述一個 JVM 和一組基礎 APIs。
Foundation Profile (FP) 提供其他 APIs。
Personal Basis Profile (PBP) 規定圖形功能。
就 Java, Standard Edition (Java SE) 而言,CDC/FP/PBP 堆棧幾乎等同於 Java Development Kit (JDK) 1.4.2。但是,對此不要過於較真 — 這只是幫助您理解 CDC/FP/PBP 堆棧的一個比方。
在 第 1 部分 中,您運行了幾個與 RI 綁定的演示應用程序。在本文中,您將學習如何創建可以在 RI 和其他 OCAP 設備上運行的應用程序。您將首先使用命令行,然後使用 Eclipse 的 OCAP 插件。
交叉編譯
一般來說,OCAP 應用程序的構建是一個交叉編譯 示例,也就是說,您在一個平台上構建應用程序,但打算在另一個平台上運行它。就移動電話等小型平台而言,交叉編譯的概念很好理解。移動電話應用程序並不在移動電話本身上構建。通常,您使用一台桌面計算機(主機)來創建將在移動電話(目標)上運行的應用程序。類似地,您可以在桌面計算機上使用一個 Java SE 環境來構建將在 OCAP 平台上運行的應用程序。
這就是麻煩所在。您在 第 1 部分 中下載的 OCAP RI 也運行在您的桌面計算機上,但它的確是一個模擬器。OCAP RI 將您的計算機模擬為一個機頂盒。
不管怎樣,如果您構建一個 OCAP 應用程序,它應該能夠在任意 OCAP 平台上運行,不管是真正的機頂盒還是像 OCAP RI 這樣的模擬器。
在命令行上磨練性格
做父母的常常會告誡他們的孩子:任何令人不快的事情都有利於磨練性格。當您使用命令行工具來構建 OCAP 應用程序時,不要忘記這一點。您肯定會學到關於構建過程到底是如何工作的很多知識。即使您選擇使用 Eclipse 來構建 OCAP 應用程序(本文後面將介紹這方面的內容),在命令行上執行構建步驟將有助於您更深刻地理解 Eclipse 為您做了哪些工作。
構建 OCAP 實現的結構
術語說明
OCAP 代碼本身可以針對包括真實設備在內的各種平台構建。另外,您還可以構建在 RI 平台上運行的 OCAP 代碼,RI 平台是一個層,它在 Windows 或 Linux 桌面計算機上模擬 OCAP 設備。OCAP RI 包括 OCAP 實現和 RI 平台。
盡管您沒有下載 OCAP RI 的完整源代碼,但您在 第 1 部分 中安裝的二進制 OCAP RI 擁有類似的目錄結構。了解這個結構有利於您定位重要文件和目錄。
一個重要的位置就是 OCAPROOT,它是 OCAP 實現源代碼的根。它是一個相當復雜的樹的根,這個樹支持在不同的主機上、針對多個目標構建代碼。例如,您可以在一台 Linux 計算機上針對一種特定的機頂盒構建 OCAP 實現。或者,您也可以在 Windows 計算機上針對 OCAP RI 平台進行構建。
OCAPROOT 的實際值取決於 OCAP RI 二進制文件的安裝位置。如果使用默認安裝位置,這個值就是 /CableLabs/tru2way/ocap-ri/ocap。(盡管 Windows 通常使用反斜槓作為路徑分隔符,為保持統一,本文使用正斜槓作為路徑分隔符。)
當您構建 OCAP 實現時,結果存儲到 ${OCAPROOT}/bin 目錄中。具體來說,這些結果被放置到其名稱反映目標平台的子文件夾中。這個目標平台由 OCAPTC 表示,構建結果存儲在 ${OCAPROOT}/bin/${OCAPTC} 文件夾中。
例如,當您構建 Windows OCAP 堆棧時,OCAPTC 就是 CableLabs/simulator/Win32/debug。
在 OCAP 構建中發現需要的內容
OCAP 實現的一個成功構建將生成一些 Java 類文件和本地庫。為了構建 OCAP 應用程序,您真正需要關心的全部內容就是定義平台的類文件。
OCAP Java 平台被打包為兩個 JAR 文件:
${OCAPROOT}/bin/${OCAPTC}/env/cvm/lib/basis.jar 是 CDC/FP/PBP 堆棧。
${OCAPROOT}/bin/${OCAPTC}/env/sys/ocap-classes.jar 包含 OCAP 實現的所有 Java 類。
代碼中的幾行
使用這些 JAR 文件來創建 OCAP 應用程序之前,您需要一些源代碼以進行構建。將清單 1 中的代碼保存為 src/HelloOcap.java(或者 下載 它):
清單 1. 一些要構建的源代碼
import javax.tv.xlet.Xlet;
import javax.tv.xlet.XletContext;
import javax.tv.xlet.XletStateChangeException;
import org.havi.ui.HScene;
import org.havi.ui.HSceneFactory;
import java.awt.*;
import java.awt.event.*;
import java.util.Vector;
import java.util.Random;
public class HelloOCAP implements Xlet {
private HScene mScene;
private HelloOCAPUI mContent;
public void initXlet(XletContext ctx) throws XletStateChangeException {
System.out.println("HelloOCAP initXlet");
HSceneFactory factory = HSceneFactory.getInstance();
mScene = factory.getDefaultHScene();
mContent = new HelloOCAPUI();
mContent.setVisible(true);
mScene.setLayout(new BorderLayout());
mScene.add(mContent, BorderLayout.CENTER);
Toolkit toolkit = Toolkit.getDefaultToolkit();
Dimension d = toolkit.getScreenSize();
mScene.setLocation(0, 0);
mScene.setSize(d.width, d.height);
mScene.validate();
}
public void startXlet() throws XletStateChangeException {
mScene.setVisible(true);
}
public void pauseXlet() {
}
public void destroyXlet(boolean forced) throws XletStateChangeException {
}
}
class HelloOCAPUI extends Container {
private boolean mInitialized;
private Font mFont;
private int mX, mY;
public HelloOCAPUI() {
mInitialized = false;
mFont = null;
mX = mY = -1;
}
public void paint(Graphics g) {
String s = "Hello, OCAP!";
if (mInitialized == false) {
mFont = new Font("Serif", Font.PLAIN, 96);
int w = getWidth();
int h = getHeight();
FontMetrics fm = g.getFontMetrics(mFont);
int sw = fm.stringWidth(s);
int sh = fm.getHeight();
int sd = fm.getDescent();
mX = (w - sw) / 2;
mY = (h + sh) / 2 - sd;
mInitialized = true;
}
g.setFont(mFont);
g.setColor(Color.blue);
g.drawString("Hello, OCAP!", mX, mY);
}
}
在清單 1 中,initXlet() 中的代碼使用一個名為 HelloOCAPUI 的助手類來為這個應用程序建立了一個顯示。HelloOCAPUI 主要處理將文本定位於屏幕中間的問題。
構建源代碼
您可以使用一個相當長的命令行來構建 HelloOcap.java,但是,如果您計劃經常執行這個操作,最好編寫一個腳本(在 Windows 中也稱為批文件)。
清單 2 是用於構建 HelloOCAPUI.java 源文件的腳本的一個示例。在 src 目錄級別上,將這個腳本保存為 build.bat。這個腳本的最後一行 — 包含 javac 的那一行 — 很長,為清晰起見,這裡將其分割為幾行:
清單 2. 一個構建腳本
@echo off
set JAVA_HOME=C:/Progra~1/Java/jdk1.6.0_16
set OCAPROOT=/CableLabs/tru2way/ocap-ri/ocap set OCAPTC=CableLabs/simulator/Win32/debug
set OCAP_ENV=%OCAPROOT%/bin/%OCAPTC%/env
if not exist bin mkdir bin
%JAVA_HOME%/bin/javac
-source 1.4
-target 1.4
-bootclasspath %OCAP_ENV%/cvm/lib/btclasses.zip;
%OCAP_ENV%/cvm/lib/basis.jar;
%OCAP_ENV%/sys/ocap-classes.jar
src/*.java
-d bin
如果您的 JDK 或 OCAP RI 位於不同的目錄中,則需要相應調整腳本。
安裝您的應用程序
下一步是說服 OCAP RI 來運行您的應用程序。為此,首先將您剛才創建的類文件復制到 OCA RI 目錄結構中。然後,在 src 目錄級別上,將清單 3 的內容保存為 bin/hostapps.properties,提供一個 hostapps.properties 文件:
清單 3. hostapps.properties
app.0.application_identifier=0x000000015205 app.0.application_control_code=AUTOSTART
app.0.visibility=VISIBLE
app.0.priority=220
app.0.base_directory=/syscwd/usr/HelloOCAP
app.0.application_name=HelloOCAP
app.0.initial_class_name=HelloOCAP
最後,在 src 目錄級別上,將清單 4 中的內容保存為一個腳本 install.bat,用於將類文件和 hostapps.properties 文件復制到 OCAP RI 中的一個文件夾中。
清單 4. install.bat
@echo off
set OCAPROOT=/CableLabs/tru2way/ocap-ri/ocap
set OCAPTC=CableLabs/simulator/Win32/debug
set OCAP_ENV=%OCAPROOT%/bin/%OCAPTC%/env
if not exist %OCAP_ENV%/usr/HelloOCAP mkdir %OCAP_ENV%/usr/HelloOCAP
xcopy /s /y bin/* %OCAP_ENV%/usr/HelloOCAP
在清單 4 中,OCAP_ENV 等同於 hostapps.properties 中的 /syscwd。這個腳本所做的全部工作就是將文件復制到一個 usr 子目錄中。
最後一步
最後一步 — 也是很重要的一步 — 是將 OCAP RI 指向剛才創建的 hostapps.properties 文件。為此,編輯 mpeenv.ini 文件。還記得嗎, 第 1 部分 介紹過,mpeenv.ini 位於 $OCAPROOT/bin/$OCAPTC/env 中,如果您在安裝 OCAP RI 時使用默認路徑,則這個位置為 /CableLabs/tru2way/ocap-ri/ocap/bin/CableLabs/simulator/Win32/debug/env。
類路徑應該在這個文件的頂部附近定義。只需在前面添加 usr/HelloOCAP 目錄,如清單 5 所示。同樣,為了便於閱讀,那個很長的行在這裡被分割為幾行。
清單 5. 更改類路徑定義
VMOPT.0=-Djava.class.path=/syscwd/usr/HelloOCAP;
/syscwd/sys/ocap-classes.jar;
/syscwd/sys/ocap-rez.jar;
/syscwd/sys/support.jar;
/syscwd/qa/ocap-test.jar;
/syscwd/qa/support-test.jar;
/syscwd;
/syscwd/usr;
/syscwd/apps/eas
下次啟動 OCAP RI 時,您將看到應用程序代碼開始工作了,如圖 1 所示:
圖 1. Hello, OCAP!
使用 Eclipse 插件
並不是每個人都喜歡使用腳本和命令行。幸運的是,OCAP RI 項目提供了一個優秀的替代方案 — 一個 Eclipse 插件,它能夠處理大量繁瑣的細節問題,讓您集中精力編寫應用程序代碼。
OCAP RI 項目將這個插件稱為 <tru2way> Workbench (TWB)。要安裝 TWB,首先需要安裝 Eclipse,然後告知 Eclipse 到哪裡可以找到 TWB,最後告知 TWB 到哪裡可以找到 OCAP RI。
安裝和運行 Eclipse
要使用 TWB,建議使用 Eclipse 的一個特殊版本:Eclipse for Java Developers 3.4.2 Ganymede SR2。Eclipse 下載文件是一個 zip 文件(大約 85MB)。要安裝 Eclipse,只需解壓縮這個文件。我將其放置到 C:/eclipse 中。
運行 c:/eclipse/eclipse.exe,啟動 Eclipse。Eclipse 將詢問您要在哪裡放置一個工作空間,工作空間只是 Eclipse 用於保存設置和文件的位置。我選擇的是 c:/eclipse-workspace,但您可以選擇任意位置。
安裝 TWB
Eclipse 啟動並運行後,從菜單選擇 Help > Software Updates...。單擊 Available Software 選項卡。單擊 Add Site... 並輸入以下 URL:
http://ri.opencable.com/sdk/updates/eclipse.3.4.2/stable/latest/
單擊 OK 後,Eclipse 將詢問 OpenCable Web 站點,找到 TWB,並在列表中顯示它,如圖 2 所示。
圖 2. 添加 TWB
選中 tru2way Workbench Feature 並單擊 Install...。Eclipse 將等待一會兒,下載 TWB,然後請求您確認安裝(如圖 3 所示):
圖 3. 確認 TWB 安裝
單擊 Next >。查看許可協議,選擇 I accept the terms of the license agreement,單擊 Finish。Eclipse 完成 TWB 安裝,並詢問是否希望重新啟動 Eclipse。這是個不錯的主意,因此單擊 Yes。
注冊 OCAP RI
您幾乎已經准備就緒,可以開始構建 OCAP 應用程序了。下一步是告知 Eclipse 關於 OCAP RI 位置的信息,以便可以使用它來運行應用程序。這個 OCAP RI 就是您在本系列的 第 1 部分 中下載並安裝的。Eclipse 將把應用程序安裝到 OCAP RI 中並為您啟動它。
從 Eclipse 菜單選擇 Window > Preferences。在左邊的列表中,選擇 RI Bundle Registry。單擊 New... 並選擇一個名為 RIBundleManifest.xml 的文件。
如果 OCAP RI 安裝到默認位置,則這個文件的路徑是 c:\CableLabs\tru2way\ocap-ri\twb_support\RIBundleManifest.xml。定位這個文件後,單擊 Open,然後單擊 OK。
恢復 mpeenv.ini
最後,如果您跟隨本文 第 1 部分 的操作,則需要撤銷對 mpeenv.ini 中的類路徑的更改。刪除 mpeenv.ini 中的類路徑定義前面的 /syscwd/usr/HelloOCAP。
創建一個新項目
最後,所有組件都已就緒,可以使用 Eclipse 創建一個新的 OCAP 應用程序了。
首先創建一個新項目。從 Eclipse 菜單選擇 File > New > Project...。現在打開 OCAP 項目並選擇 New OCAP Project。單擊 Next >。
輸入 HelloOCAP 作為 Project name。單擊 Next >,選擇 Hello World Template 並單擊 Finish。
Eclipse 將建立整個項目,其中包括一個 Xlet 類,名為 org.ocapproject.xlet.HelloWorld。您需要做的就是為 OCAP RI 進行設置。
創建一個服務配置
從 Eclipse 菜單選擇 Run > Package Services > Open Services Dialog...。在本質上,您將設置進入 hostapps.properties 文件的字段。
在左邊的列表中,選擇 Xlet Service Configurations 並單擊 new 圖標,如圖 4 所示。
圖 4. new 圖標
表 1 列示了匹配這個示例的值:
表 1. 創建一個服務配置
條目 值 Application Name HelloOCAP Application ID 0x5025 Organization ID 0x1 Control Code Autostart Visibility Visible Type Unbound Base Directory C:/eclipse-workspace/HelloOCAP/bin填充這些字段後,單擊 Apply,然後單擊 Package。
創建一個運行配置
最後一步是告知 Eclipse 您要使用剛才創建的服務配置(類似於一個 hostapps.properties 文件)。執行這個操作的方法稱為一個運行配置。
從 Eclipse 菜單選擇 Run > Run Configurations。選擇 OCAP Simulation 並單擊 new 圖標。
鍵入 Hello-1-run-configuration 作為 Name。單擊 Unbound Xlets,然後單擊 Add...。在下拉列表框中,選擇剛才創建的服務配置:HelloOCAP-service-configuration。
單擊 Apply,然後單擊 Run。OCAP RI 將彈出,稍等片刻,屏幕上將顯示一個簡單的 “Hello World!”。
要正確停止 OCAP RI,從 Eclipse 菜單選擇 TWB > Stop Emulator。
理解開發循環
要理解這個開發循環,可以在源代碼中進行一個更改,然後在 OCAP RI 上運行修改後的 Xlet。
在 Eclipse 歡迎屏幕內,單擊 workbench 圖標,如圖 5 所示:
圖 5. Eclipse 的 workbench 圖標
在 HelloOCAP 項目中,展開 src,然後展開 org.ocapproject.xlet。雙擊 HelloWorld.java,在源代碼編輯器中打開它。
對源代碼進行一些更改。(一個簡單的更改是修改 HELLOWORLD_STR 的定義。)保存文件,從 Eclipse 菜單選擇 Run > Run History > HelloOCAP-run-configuration。Eclipse 將負責重新構建這個項目,正確對其打包,並啟動 OCAP RI。您將立即看到您的更改。
使用調試器
Eclipse 支持設置斷點,逐步調試代碼,檢查變量,以及執行其他有用的操作。為此,您只需創建一個 debug 配置文件而不是一個 run 配置文件,它們的創建過程幾乎完全相同。
從 Eclipse 菜單選擇 Run > Debug Configurations。您將看到,運行配置已經在左邊的列表中創建。選擇 OCAP Simulation 並單擊 new 圖標。
鍵入 HelloOCAP-debug-configuration 作為 Name。單擊 Unbound Xlets,然後單擊 Add...。在下拉列表框中,選擇剛才創建的服務配置:HelloOCAP-service-configuration。
單擊 Apply,然後單擊 Close。
運行之前,在源代碼中創建一個斷點,以便您能夠看到運行中的調試。假設您想調試 HelloWorld 中的用戶界面創建。滾動代碼編輯器到達第 198 行,這是 initGUI() 方法的第 1 行。在文本區域左邊的深灰色槽中,雙擊創建一個斷點。這個斷點看起來就像一個藍色小圓圈,如圖 6 所示:
圖 6. 設置一個斷點
現在啟動調試器。再次選擇 Run > Debug Configurations,選擇 HelloOCAP-debug-configuration,然後單擊 Debug。OCAP RI 啟動,調試器命中您的斷點,Eclipse 詢問是否希望打開 Debugger 透視圖。選中 Remember my decision 並單擊 Yes。
調試器顯示所有正在運行的線程列表,您可以在這裡檢查變量,這裡也是可以逐步執行源代碼的另一個位置。使用工具欄中的圖標逐步執行代碼,進入代碼,或者繼續執行。
要了解關於如何使用 Eclipse 和調試器的更多信息,請參閱 Eclipse 文檔。
操作完成後,與前面一樣,使用 TWB > Stop Emulator 關閉 OCAP RI。
第 2 部分總結
本文介紹如何針對 OCAP 設備創建自己的應用程序,並使用 OCAP RI 在桌面計算機上運行這些應用程序。盡管可以通過命令行來完成這個任務,但有一個 Eclipse 插件可以簡化這個過程。使用 Eclipse,您還可以利用優秀的調試功能。
現在,您對 OCAP 的作用和實現您的想法所需的工具已有所了解。OCAP 在 CDC/FP/PBP 中的基礎表示您可以使用一個豐富的 API 調色板來構建您的應用程序。您可以繼續進行一些美妙的嘗試!請您繼續關注第 3 部分,以便深入研究 OCAP RI 源代碼。
原文:http://www.ibm.com/developerworks/cn/java/j-ocap2/