承接第一部分,本文教你如何開發可在 OCAP RI 及真實機頂盒運行的應用程式。涵蓋命令列交叉編譯全流程與 Eclipse
OCAP 應用屬交叉編譯:在桌面(Host)用 Java SE 環境建置,目標運行於 OCAP 平台(Target,CDC/FP/PBP ≈ JDK 1.4.2)。OCAP RI 將桌面模擬為機頂盒,編譯產出的應用理論上可在任何 OCAP 裝置運行。
import javax.tv.xlet.*;
import org.havi.ui.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
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) {
mFont = new Font("Serif", Font.PLAIN, 96);
int w = getWidth(), h = getHeight();
FontMetrics fm = g.getFontMetrics(mFont);
int sw = fm.stringWidth(s), sh = fm.getHeight(), sd = fm.getDescent();
mX = (w - sw) / 2; mY = (h + sh) / 2 - sd;
mInitialized = true;
}
g.setFont(mFont); g.setColor(Color.blue); g.drawString(s, mX, mY);
}
}
@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
關鍵:-bootclasspath 指定 OCAP 平台 JAR(basis.jar = CDC/FP/PBP,ocap-classes.jar = OCAP API),確保編譯針對目標平台。
bin/hostapps.properties 描述應用屬性(ID、啟動模式、主類別等)install.bat 將類別檔複製至 RI env/usr/HelloOCAPmpeenv.ini 類路徑,加入 /syscwd/usr/HelloOCAP雙擊桌面圖標或執行 runRI.bat,畫面顯示 "Hello, OCAP!":

https://ri.opencable.com/sdk/updates/eclipse.3.4.2/stable/latest/RIBundleManifest.xml(預設 c:\CableLabs\tru2way\ocap-ri\twb_support\)mpeenv.ini 類路徑(移除手動加入的項目)HelloOCAP → 選 Hello World Template| 欄位 | 值 |
|---|---|
| Application Name | HelloOCAP |
| Application ID | 0x5025 |
| Organization ID | 0x1 |
| Control Code | Autostart |
| Visibility | Visible |
| Type | Unbound |
| Base Directory | C:/eclipse-workspace/HelloOCAP/bin |
| Xlet Class | org.ocapproject.xlet.HelloWorld |
點擊 Apply → Package。
Hello-1-run-configuration → Unbound Xlets 加入剛建立的服務配置 → RuninitGUI()),以 Debug 模式啟動,Eclipse 切換至 Debug 透視圖,支援單步執行、變數檢視修改原始碼(如變更 HELLOWORLD_STR),Save → Run History 選擇配置,Eclipse 自動重建、打包、啟動 RI,即時看到變更。
掌握命令列與 Eclipse 兩種開發模式,你已能為 OCAP 平台建立應用。CDC/FP/PBP 豐富 API 任你發揮。下一章將深入 RI 內核,敬請期待!