ホーム > デベロッパ > BREW プログラミング入門 > "HelloWorld" プログラムを作ろう > - 2 / 3 -

"HelloWorld" プログラムを作ろう ( BREW 2.1 編 ) - 2 / 3 -

BREW プロジェクトの作成

それでは BREW モジュールのプロジェクトを作成しましょう。

  1. Visual C++ 6 を起動します。
  2. メニューの [ファイル] - [新規作成] を選択し、[新規作成] ダイアログの [プロジェクト] タブを開きます。 BREW SDK が正しくインストールされていれば、プロジェクトの種類に [BREW Application Wizard] という項目があるはずです。これを選択します。
  3. [プロジェクト名] に "HelloWorld" と入力します。 [位置] にプロジェクトを格納するフォルダを入力します。 [OK] を押します。
    BREW Application Wizard
  4. ウィザードの [ステップ 1/2] では、BREWアプリケーションで使用する機能を選択します。以下のような機能があります。
    項目名 機能
    File ファイル入出力機能
    Network ネットワーク通信機能
    Database データベース機能
    TAPI/SMS 電話制御 / ショート メッセージ機能
    Sound サウンド機能

    これらの機能を選択すると、自動生成されるソースコードにこれらの機能を提供するAPIのヘッダーファイルがインクルードされます。あとからソースコードに手動でインクルードできるので、必ずしも今の段階で指定する必要はなく、また実際に使わない機能を選択しても特に害はありません。

    今回は "Hello World" と表示するだけの単純なアプリケーションですので、いずれの機能も使用しません。何も選択せずに [次へ] ボタンを押しましょう。

    BREW Application Wizard2
  5. ウィザードの [ステップ 2/2] では、中央にある [MIF Editor] というボタンを押すことで、 MIF エディタが起動し、 MIF ファイルを作成することができます。

    MIF ファイルは既に作成したので、ここではなにもせずに [終了] ボタンを押すことにしましょう。

    BREW Application Wizard3
  6. これでウィザードが終わりました。最後に [新規プロジェクト情報] ダイアログが表示されるので、[OK] ボタンを押しましょう。

これで BREW プロジェクトが作成されました。

BREW プロジェクトの内容

BREW アプリケーション ウィザードが生成したファイルを調べてみましょう。 Visual C++ の左側の [FileView] タブを見ると、三つのファイルがプロジェクトに追加されているはずです。

まず AEEAppGen.c と AEEModGen.c ですが、このファイルの中身を知る必要はあまりありません。また、このファイルを編集してはいけません。

[FileView] の AEEAppGen.c を右クリックして、メニューから [プロパティ] を選択してみてください。[コピー元 ファイル プロパティ] ダイアログの [ファイル名] が "C:\Program Files\BREW SDK v2.1.1 Ja\src\AEEAppGen.c" のようになっており、 BREW SDK をインストールしたフォルダ内にあることが分かります。

つまり、この二つのファイルは、 BREW アプリケーション ウィザードで生成した複数の BREW プロジェクトから共有されるソースコードですので、不用意に編集してはいけないのです。

開発者が編集できるのは HelloWorld.c だけです。ここに HelloWorld アプレットの実装を記述します。 [FileView] で HelloWorld.c をダブルクリックして、このファイルを開いてみましょう。

何やらごちゃごちゃと英語でコメントが書いてあるのが分かります。英語のコメントを削除したものを以下に示します。


//
//  HelloWorld.c
//

#include "AEEModGen.h"     // 常にインクルードします
#include "AEEAppGen.h"     // 常にインクルードします
#include "AEEShell.h"      // シェル インターフェイス

// 前方宣言
static boolean HelloWorld_HandleEvent(
    IApplet * pi, AEEEvent eCode, 
    uint16 wParam, uint32 dwParam);

//
//  ユーザーがアプレットを起動要求したときに、呼び出されます。
//  開発者は指定されたクラス ID の BREW アプレットを作成して返すことで、
//  BREW アプレットを起動します。
//
int AEEClsCreateInstance(
    AEECLSID ClsId,       // クラス ID
    IShell * pIShell,     // シェル インターフェイス
    IModule * po,         // モジュール インターフェイス
    void ** ppObj)        // 作成したアプレットを返すポインタ
{
    *ppObj = NULL;

    if (ClsId == AEECLSID_HELLOWORLD) {
        if(AEEApplet_New(sizeof(AEEApplet), ClsId, pIShell, po,
            (IApplet**) ppObj, (AEEHANDLER) HelloWorld_HandleEvent, NULL)) {
            return AEE_SUCCESS;
        }
    }
    return EFAILED;
}

//
//  HelloWorld アプレットのイベント ハンドラ
//
static boolean HelloWorld_HandleEvent(
    IApplet * pi,       // アプレット構造体
    AEEEvent eCode,     // イベントコード
    uint16 wParam,      // イベント パラメータ (16 ビット)
    uint32 dwParam)     // イベント パラメータ (32 ビット)
{
    switch (eCode)
    {
    case EVT_APP_START:
        // ここにコードを追加します。
        return TRUE;

    case EVT_APP_STOP:
        // ここにコードを追加します。
        return TRUE;

    default:
        break;
    }
    return FALSE;
}


BREW ウィザードが生成したコードは、 AEEClsCreateInstance() と HelloWorld_HandleEvent() という二つの関数であることが分かります。

AEEClsCreateInstance() は、ユーザーが BREW アプレットのアイコンを選択して起動したときに呼び出される関数です。開発者はこの関数内で BREW アプレットのデータ構造体を作成して返す必要があります。

HelloWorld_HandleEvent() は、ユーザーが携帯電話のキーを押したり、アプリを終了させたりなど、さまざまな操作を行ったときに呼び出される関数です。

BREW アプレットの構造

BREW アプレットは、 "アプレット構造体" と "イベント ハンドラ" のペアで構成されます。

アプレット構造体とは、 BREW アプレットがデータを格納するための構造体で、そのアプレットでグローバルに使用する変数などを格納しておきます。 BREW ウィザードが生成したコードでは、デフォルトで AEEApplet 構造体が使用されています。この構造体の詳細については次回以降の連載で解説しますので、今回は説明しません。

イベント ハンドラとは、 BREW 実行環境からのさまざまな通知を受け取る関数で、ユーザーがキーを押したときなどに呼び出されます。 BREW ウィザードが生成したコードでは、デフォルトで HelloWorld_HandleEvent() 関数が使用されています。

brew applet

*生成されたコードでは BREW アプレットのデータ構造体として AEEApplet を使用していますが、これは (ある規則に従った) 任意の構造体に置き換えることができます。今回の HelloWorld アプレットでは AEEApplet をそのまま使うことにします。

BREW アプレットの作成

ユーザーが携帯電話の BREW アプレットの一覧からアイコンを選択して起動すると、 BREW 実行環境は、 AEEClsCreateInstance() 関数を呼び出して BREW アプレットを作成するように要求します。

AEEClsCreateInstance() 関数では、要求された BREW アプレット構造体を作成して返す必要があります。一つの BREW モジュールには複数の BREW アプレットを含めることができるため、個々の BREW アプレットを区別するために、1番目の引数にクラス ID を指定して呼び出してきます。

AEEClsCreateInstance() 関数に指定されたクラス ID が、あなたが開発している BREW アプレットに等しい場合にだけ、その BREW アプレットを作成して返します。

これを実現しているのが、 BREW ウィザードが生成した下記のコードです。


//
//  ユーザーがアプレットを起動要求したときに、呼び出されます。
//  開発者は指定されたクラス ID の BREW アプレットを作成して返すことで、
//  BREW アプレットを起動します。
//
int AEEClsCreateInstance(
    AEECLSID ClsId,         // クラス ID
    IShell * pIShell,       // シェル インターフェイス
    IModule * po,           // モジュール インターフェイス
    void ** ppObj)          // 作成したアプレットを返すポインタ
{
    *ppObj = NULL;

    // クラス ID が HelloWorld アプレットの ID に等しい場合、
    // HelloWorld アプレット構造体を作成して返します。
    if (ClsId == AEECLSID_HELLOWORLD) {
        if(AEEApplet_New(sizeof(AEEApplet), ClsId, pIShell, po, (IApplet**)ppObj, 
            (AEEHANDLER) HelloWorld_HandleEvent, NULL)) {
            return AEE_SUCCESS;
        }
     }
     return EFAILED;
}


このコードでは、 BREW 実行環境が AEECLSID_HELLOWORLD というクラス ID の BREW アプレットを要求してきた場合だけ、アプレット構造体を作成して返しています。

アプレット構造体の作成は AEEApplet_New() という関数を呼び出すことで行います。この関数は、 AEEApplet 構造体のメモリを確保し、 AEEApplet 構造体にイベント ハンドラである HelloWorld_HandleEvent() を結びつけることでアプレット構造体を作成しています。

なお、HelloWorld のクラス ID をソースコードで使用しているため、ソースコードに HelloWorld.bid ファイルをインクルードする必要があります。 HelloWorld.c の冒頭に、

 #include "HelloWorld.bid"

と書いておいてください。