程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> OCAP入門,第2部分: 為OCAP RI編寫應用程序

OCAP入門,第2部分: 為OCAP RI編寫應用程序

編輯:關於JAVA

本系列第 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
注意,如果您為 Eclipse 工作空間選擇了不同的位置,那麼您可能會擁有不同的項目路徑。 Xlet Class org.ocapproject.xlet.HelloWorld

填充這些字段後,單擊 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/

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved