SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

japan.internet.com翻訳記事

プリプロセッサを使ってJ2MEアプリケーションの移植を自動化する

アプリケーションを様々な機種に効率よく対応させる方法

具体例

 MyGameというゲームを、MIDP1、MIDP2、MIDP1 NokiaUI、MIDP1 Motorolaのデバイスに移植するものとします

 移植手順の概要は次のとおりです。

  1. AntおよびAntennaをダウンロードし、インストールします。
  2. サウンドのためのクラスを作成します。このクラスに各デバイスのサウンドを再生するためのコードを入れます。
  3. 各デバイスモデル(MIDP1、MIDP2、MIDP1 NokiaUI、MIDP1 Motorola)の一連のAntenna XMLファイルを作成します。これらのファイルは次のことを行います。
  4. ソースファイルをプリプロセスし、現在のデバイスに関係する行だけを残します。
  5. ソースファイルをコンパイルし、クラスを事前に検証して、プロジェクトをビルドします。
  6. 移植したミッドレットをテストのためにエミュレータで実行します。

SoundManagerクラスの作成

 SoundManagerクラスには、基本的なサウンドを再生し、バックライトを設定するための命令が含まれます。このクラスは次の汎用デバイスをサポートします。

  • MIDP1
  • このデバイスはサウンドとバックライトをサポートしていないので、メソッドは空になります。
  • MIDP2
  • このデバイスはサウンドとバックライトをサポートしているので、//#ifdef MIDP2//#endifの間のコード行が選択されます。
  • MIDP1 NokiaUIこのデバイスはサウンドとバックライトをサポートしているので、//#ifdef NOKIAUI//#endifの間のコード行が選択されます。
  • MIDP1 Motorolaこのデバイスはバックライトだけをサポートしているので、サウンドを再生するためのメソッドは空になります。

 リスト1にコードを示します。

リスト1 SoundManagerクラス
//#ifdef MIDP2
import javax.microedition.media.*;
import javax.microedition.media.control.*;
import javax.microedition.media.control.ToneControl;
//#endif
//#ifdef NOKIAUI
import com.nokia.mid.sound.*;
import com.nokia.mid.ui.*;
//#endif
//#ifdef MOTOROLA
import com.motorola.multimedia.*;
//#endif
import javax.microedition.lcdui.*;
import java.io.*;

public class SoundManager {

  Display display;

  public SoundManager(Display display) {
    this.display = display;
  }

  public void doLight() {
//#ifdef MIDP2
    display.flashBacklight (duration);
//#endif
//#ifdef NOKIAUI
    try {
      DeviceControl.setLights (0,100);
    } catch (Exception exception) {
    }
//#endif
//#ifdef MOTOROLA
    try {
      Lighting.backlightOn();
    } catch (Exception exception) {
    }
//#endif
  }

  public void doSound() {
//#ifdef MIDP2
    try {
      InputStream is = getClass().getResourceAsStream("music.mid");
      Player audioPlayer = Manager.createPlayer(is, "audio/midi");
      audioPlayer.start();
    } catch (IOException ioe) {
    }
//#endif
//#ifdef NOKIAUI
    Sound sound = new Sound (1000, 100);
    sound.play(1);
//#endif
  }
}

「BUILD.XML」ファイルの作成

 「BUILD.XML」ファイルの中で適切なディレクトリを選択します。これは手作業になるので、デバイスごとにXMLファイルを作成し、それらを保持しておくことが望ましいでしょう。

 MIDP2プロファイルの場合は、「SoundManager.java」ファイルのプリプロセスによって次の出力が生成されます。

import javax.microedition.media.*;
import javax.microedition.media.control.*;
import javax.microedition.media.control.ToneControl;
import javax.microedition.lcdui.*;
import java.io.*;

public class SoundManager {

  Display display;

  public SoundManager(Display display) {
    this.display = display;
  }

  public void doLight() {
    display.flashBacklight (duration);
  }

  public void doSound() {
    try {
      InputStream is = getClass().getResourceAsStream("music.mid");
      Player audioPlayer = Manager.createPlayer(is, "audio/midi");
      audioPlayer.start();
    } catch (IOException ioe) {
    }
  }
}

 MIDP1プロファイルの場合は、次の出力が生成されます。

import javax.microedition.lcdui.*;
import java.io.*;

public class SoundManager {

  Display display;

  public SoundManager(Display display) {
    this.display = display;
  }

  public void doLight() {
  }

  public void doSound() {
  }
}

 デバイスのプロファイルは次の行で選択します。

<wtkpreprocess srcdir="src" destdir="output\src" 
  symbols="MIDP2" verbose="false"/>

 Antennaは属性シンボルの内容を取り(この例ではMIDP2)、次のように各ファイルの先頭に//#define MIDP2を挿入します。

//#define MIDP2
//#ifdef MIDP2
import javax.microedition.media.*;
import javax.microedition.media.control.*;
import javax.microedition.media.control.ToneControl;
//#endif
//#ifdef NOKIAUI
import com.nokia.mid.sound.*;
import com.nokia.mid.ui.*;
//#endif
//#ifdef MOTOROLA
import com.motorola.multimedia.*;
//#endif
import javax.microedition.lcdui.*;
import java.io.*;

プリプロセスされたソースコードのビルド

 次にプリプロセスされたソースコードをビルドします。つまり、作成した2つのファイルをコンパイルするわけです。

 .jadファイルの名前とその内容をタグの中で指定します。

<wtkjad jadfile="output\bin\${midlet.name}.jad"
  jarfile="output\bin\${midlet.name}.jar"
  name="${midlet.name}"
  vendor="You"
  version="1.0"
  target="">
    <midlet name="${midlet.name}" icon="/icon.png" 
      class="game.${midlet.name}"/>
        <attribute name="MIDlet-Icon" value="/icon.png"/>
    </wtkjad>

 アイコンに対して常に同じ名前を使用するようお勧めします(例:icon.png)。

 ミッドレットをパッケージ化するには、.jarファイルを作成します。.jadファイルに統合するリソースを選択してください。このプロセスの簡単なガイドラインを以下に示します。

  • グラフィックスを画面のタイプごとに分けます(大きな画面、中程度の画面、小さな画面など)。
  • アイコンをサイズごとにサブディレクトリに分けます(res_icon32x32、res_icon16x16など)。
  • サウンドのリソースを分けます(res_midifiles、res_ottfilesなど)。

 次の表2では、右側の欄がコードで、左側の欄がその説明になっています。

表2 プリプロセスされたコードのビルド
表2 プリプロセスされたコードのビルド

「RUN.XML」ファイルの作成

 エミュレータを実行するためには、XMLファイルを作成する必要があります。エミュレータはWTKのディレクトリ「wtklib\devices」にインストールします。WTKに表示されるデバイス名を使用し(デバイスのディレクトリ名)、それを属性デバイスの次の行で指定してください。

<wtkrun jadfile="output\bin\${midlet.name}.jad" 
  device="DefaultColorPhone"/>

 次の表3では、右側の欄が「RUN.XML」ファイルのコードで、左側の欄がその説明になっています。

表3 「RUN.XML」ファイルのコード
表3 「RUN.XML」ファイルのコード

 この例では、いくつかのデバイスについて基本的なサウンドとバックライトをサポートしています。しかし、実際には、その他の機能(キーボード定数、全画面サポート、画面リフレッシュループ、フレームレートの調整、イメージとサウンドの形式など)もサポートする必要があるでしょう。

完全なプロダクションチェーンへの取り組み

 デプロイメントとテストが非常に重要であることを忘れないでください。デバイスモデルごとに細かな手作業を繰り返さなければならないので、モバイル開発は単調で退屈な作業になりがちです。.jadファイルや.jarの名前をいちいち変更したり、各.jadファイルの内容を修正するといった作業を想像してみてください。あるいは、テストのためのテストWAPサーバへのアップロードが手作業で、300とか400のデバイスについてFTPクライアントを使用しなければならないとしたらどうなると思いますか。

 オプションのAPI(Bluetooth、3D、ファイル接続、SMS、MMSなど)とオプションのAPIパーツ(カメラサポート、オーディオ記録、.jpegなど)をすべて考慮に入れることが望ましいでしょう。デバイスの中により強力な機能を提供できるものがある場合には、すべてのデバイスについて同じアプリケーションを生成し続けるのは避けてください。

 移植は基礎的な問題ですが、最適化され充実したモバイルアプリケーションを生成するうえで大きな障害とはなりません。結局のところ、完全に共通利用できるモバイルアプリケーションは、モバイルデバイスの構造のせいで不可能です。ますます複雑になるソフトウェアを埋め込むというのが世の趨勢であり、従って常に実装で問題が生じることになるのです。

この記事は参考になりましたか?

連載通知を行うには会員登録(無料)が必要です。
既に会員の方はを行ってください。
japan.internet.com翻訳記事連載記事一覧

もっと読む

この記事の著者

japan.internet.com(ジャパンインターネットコム)

japan.internet.com は、1999年9月にオープンした、日本初のネットビジネス専門ニュースサイト。月間2億以上のページビューを誇る米国 Jupitermedia Corporation (Nasdaq: JUPM) のニュースサイト internet.comEarthWeb.com からの最新記事を日本語に翻訳して掲載するとともに、日本独自のネットビジネス関連記事やレポートを配信。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

Bruno Delb(Bruno Delb)

フランス語で書かれたJ2MEに関する最初の書籍の著者で、Net InnovationsおよびUnified Mobilesの創始者でもある。Unified MobilesはUMAK(Unified Mobile Application frameworK)に基づいた統一モバイルアプリケーション開発という概念を生み出した。UMAKはマルチプラットフォームアプリケーション(J2ME、DoJa、Webアプレット)の開発を促進する完備したフレームワークである。UMAKはデバイスに関する非常に詳細な知識ベースとJavaテストスイートと生産性ツールスイートと構成エンジンを基にしており、各デバイスモデルの各機能を考慮に入れている。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/861 2007/01/19 00:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー