ホーム > デベロッパ > BREW FAQ

BREW FAQ : BREW プログラミング

携帯電話外部からデータを収集するには?

携帯電話の外部からデータを収集する方法は 2 つあります。

  1. TCP/IP 通信を利用する方法
  2. シリアルケーブルを利用する方法 ( BREW SDK 3.x 以降 )
  3. Bluetooth を利用する方法 ( キャリアにお問合せるください )
      

TCP/IP のConnect 部分でプログラムが異常終了するのですが …?

MIF ファイルの特権レベルの設定をご確認ください。

「ネットワーク」の設定になっていなければ通信できません。

また、通信プロトコルの実装によっては、奇数アドレスから 2 バイトや 4 バイトのデータを読み書きすると、CPU 例外が発生してアプリがフリーズします。

      

すぐに ネットワーク接続がクローズしないのですが …?

INetMgr インスタンスは ISOCKET_Close() や ISOCKET_Release() が呼ばれた後も、 一定の待機時間 (通常は 30 秒) が過ぎるまで、ネットワーク接続はクローズしません。

すぐにネットワーク接続をクローズするには、ISocket_Release() の後で、 INetMgr_Release() を呼び出します。

      

大きな音声ファイルを再生するには?

一括で読み込むには大きすぎる音声ファイルを途切れずに再生するには、IMediaUtil インターフェイス、または IMedia 派生インターフェイスを使います。

このとき、メディアデータ構造体 (AEEMediaData) に音声ファイル名を設定し、IMediaUtil_CreateMedia() や IMEDIA_SetMediaData() を呼び出します。

IMediaUtil インターフェイスを使うときの手順は以下のとおりです。

  1. ISHELL_CreateInstance() を呼び出し、IMediaUtil インタフェースを作成します。
  2. メディアデータ構造体に音声ファイル名を設定します。
      AEEMediaData {
      clsData = MMD_FILE_NAME
      pData   = 音声ファイル名
      dwSize  = 0
      }
  3. IMediaUtil_CreateMedia() を呼び出し、IMedia 派生インタフェースを作成します。
  4. IMedia_Play() を呼び出し、音声を再生します。
      

BREW アプリの処理の流れは?

アプリケーションマネジャーが BREW アプリの AEEClsCreateInstance() 関数を呼び出すことでBREW アプリは開始します。

【 BREW アプリの処理の流れ 】
BREW アプリの 処理の流れ

続きを読む »

      

メモリの扱いに関する注意点は? 

BREW プログラミングでは、メモリの確保と解放はプログラマが明示的に行なわなければなりません。

Java のようにガベージコレクションが働いて、使われなくなったメモリが自動的に再利用されることはありません。

確保したメモリを解放し忘れると、使用可能なメモリ容量が次第に減少する、いわゆる「メモリリーク」という現象が発生します。

「メモリリーク」は検出が困難なバグのひとつでとても厄介です。

「メモリリーク」の問題を避けるには、確保したメモリは必ず解放する必要があります。

また、メモリの確保と解放を何度も繰り返していると、空きのメモリ領域が断片化し、時間の経過と共にまとまったメモリ領域を確保することが次第に困難になります。

このような事態を避けるには、滅多に必要とされないものを除いて、アプリの開始時またはレジューム時にアプリ全体が必要とするメモリをまとめて確保し、アプリの終了時またはサスペンド時にそのメモリをまとめて解放するようなプログラミングスタイルが必要です。

      

カメラのアプリが BREW 2.1 エミュレータで動作しないのですが…

BREW 2.1 エミュレータは、 ICAMERA インターフェースをサポートしておりません。

弊社では、Camulator という ICAMERA インターフェースをシミュレートするツールを
公開しております。

Camulator を使うと、 ICAMERA インターフェースを使うカメラのアプリは BREW 2.1 エミュレータで動作します。

※ BREW 3.1 以降、PCにカメラを接続することによりカメラのアプリをエミュレータ上で動作させることが可能になっています。

 関連情報

      

サスペンドとレジューム について教えてください。

      

大域変数 ( グローバル変数 ) や 静的変数 ( static 変数 ) は使えますか?

原則として、BREW では大域変数や 静的変数は使えません。

一般に、BREWアプリを構成するモジュール間でデータを受け渡しをするには、引数またはアプレット構造体を用います。

ソフィア・クレイドル社の svHacker を使えば、大域変数や静的変数が使えます。

      

アプレット構造体とは?

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

アプレット構造体とは、 BREW アプリがデータを格納するための構造体で、そのアプレットでグローバルに使用する変数などを格納します。

BREW ウィザードが生成したコードでは、デフォルトで AEEApplet 構造体が使用されています。

      

浮動小数点演算や数学関数を使うには?

BREW で 浮動小数点演算や ANSI 標準 C ライブラリに含まれる数学関数を使うには、BREW ヘルパ関数を使います。

BREW ヘルパ関数で、数式を記述すると煩雑なプログラムになる傾向にあり、望ましくありません。

関連情報の 「BREW での浮動小数点演算と数学関数」 には、通常の C プログラミングの要領で浮動小数点演算や数学関数を扱う方法が記されています。

      

コールバックとは?

DNS サーバーへの問い合わせは携帯電話側では DNS サーバーからの返答待ちの状態がしばらく続く処理です。

このような場合、BREW ではその処理が終了したときに自動的に呼び出される関数を登録します。

コールバック関数登録後、アプリは速やかに現在のイベント処理を完了して BREW に制御を戻し、次のイベントを待ちます。

この仕組みが、いわゆる「コールバック」です。

登録された関数はコールバック関数と呼ばれます。コールバック関数には返答が返ってきた後にする処理を記述します。

コールバック関数を登録する関数は目的によって異なります。

[ ソケット通信関連の例 ]

続きを読む »

      

BREW ヘルパ関数とは?

BREW では ANSI 標準 C ライブラリが使えませんが、文字列処理、数学計算、メモリ操作など ANSI 標準 C ライブラリと同等の機能を持つ関数が、BREW ヘルパー関数として用意されています 。

BREW ヘルパ関数は、BREW インターフェースのインスタンス生成が不要です。

BREW SDKの AEEStdLib.hというヘッダで宣言されていますので、BREW ヘルパ関数を使うときは、このファイルをインクルードします。

※ BREW ヘルパ関数には、 ANSI 標準 C ライブラリにはない、BREW 特有の便利な関数も含まれます。

      

タイマーとは?

タイマーとは、一定時間の経過後に関数を呼び出してくれる仕組みのことです。 アニメーションの表示など、ある一定のタイミングで処理を行いたい場合に使用します。 タイマーを使用するには、ISHELL_SetTimer 関数や ISHELL_SetTimerEx 関数を使用します。

たとえば、ISHELL_SetTimer 関数は以下のように定義されています。

ISHELL_SetTimer(
 IShell*   shell ,      // IShell インターフェイス
 int32     millisecs ,  // タイマーが経過時間をミリ秒で指定します。
 PFNNOTIFY fn,          // コールバック関数を指定します。
 void*     data         // コールバック関数に渡されるデータを指定します。
);

タイマーにより呼び出されるコールバック関数は、以下のプロトタイプをもつ必要があります。

// コールバック関数のプロトタイプ宣言
void TimerCallBack(void* pData);

SophiaFramework では、 SFBShell::SetTimer 関数や SFBShell::SetTimerEx 関数を使用します。 タイマーに登録するコールバック関数は、 void* 型の引数を持つ戻り値なしの関数を使用します。

【 コード例 】

続きを読む »

      

AEEAppGen.c や AEEModGen.c は何をするコードですか?

これらのファイルは、すべての BREW アプリに共通するアプリの起動コードや BREW ヘルパ関数を提供します。

具体的には、AEEAppGen.c は IApplet インターフェースと IDisplay インターフェース、AEEModGen.c は IModule インターフェースのインスタンスを作成し利用可能にし、アプリ実行に必要なリソースを確保します。

これらはBREW アプリケーション ウィザード によって自動生成されるコードであり、開発者はこれらのファイルを直接編集する必要はありません。

但し、これらのコードを読むことでより深くBREW が理解できます。

      

タイマーをキャンセルするには?

登録したタイマーが満了する前にそれをキャンセルするには、 ISHELL_CancelTimer 関数を使用します。

SophiaFramework では、 SFBShell::CancelTimer 関数を使用します。

【 コード例 】

[ BREW API のみを使用したコード ]

// タイマーのキャンセル
ISHELL_CancelTimer(app->a.m_pIShell,   // IShell インターフェイス
OnTimer,            // コールバック
app);               // ユーザー データ

[ SophiaFramework を使用したコード ]

// SFBShell インスタンスを作成します。
SFBShellSmp  shell = SFBShell::GetInstance();

// タイマーのキャンセル
shell->CancelTimer(OnTimerEntry,  // コールバック
                   this);         // ユーザー データ
      

タイマーとアラームの違いは?

ある処理を一定時間後、或いは一定時間間隔で自動的に実行させる場合、「タイマー」または「アラーム」を使います。

「タイマー」はミリ秒単位で設定し、コールバック関数で処理します。

「アラーム」は分単位で設定し、EVT_ALARMイベントに対するイベントハンドリングとして処理します。

「タイマー」はサスペンド中は無効ですが、「アラーム」ではサスペンドしていても有効です。

「タイマー」はミリ秒単位の短い処理に、「アラーム」は分単位の長い処理に使われます。

 関連情報

      

インタフェースオブジェクトへのポインタが有効かどうか調べるには

インターフェイスオブジェクトへのポインタが有効であるかどうかを判定する一般的な手段はありません。

インターフェイスを使用したい場合は、ポインタが無効にならないように参照カウントを自前で管理する必要があります。

      

組込みブラウザ起動直後にアプリを終了させるには?

残念ながら、組込みブラウザ起動直後にアプリを終了させる方法は確認できていません。

ISHELL_BrowseURL() 、ISHELL_CloseApplet() の順に呼び出す実験してみましたが、組込みブラウザが起動する前に BREW アプリは終了しました。

      

タイマー( ISHELL_SetTimer 関数 ) の動作速度が急に遅くなるのですが ・・・?

タイマーを繰り返し使って いると、携帯端末が 「Sleep モード」 になることがあります。

そのとき、EVT_APP_NO_SLEEP イベントが BREW からアプリに送られ ます。

このイベントに対する処理を正しく行えば、動作速度の問題は解消します。

      

BREW で C++ 言語は使用できますか?

BREW で C++ プログラミングするための開発環境として SophiaFramework があります。

SophiaFramework は、高い信頼性とルック & フィールに秀でた GUI を兼ね備える BREW アプリを、従来の 3 分の 1 以下の期間と費用で開発できる、世界初の C++ クラスライブラリ & GUI フレームワークです。

アーキテクチャーは GUI フレームワーク、ユーティリティー、 C++ ラッパーの 3 つの層から構成されます。

ユーティリティーには、POP/SMTP、HTTP/HTTPS を含むネットワーク、コレクション、ストリーム、文字列、バッファ、シェイプ、カラー、数学演算などの機能があります。

BREW で C++ プログラミングするノウハウについては関連情報をご覧ください。


続きを読む »

      

サスペンド / レジュームのとき、アプリのコンテキストはどうなりますか?

サスペンドやレジュームのとき、ヒープメモリにあるアプリが使用している情報の退避と復帰は自動的になされません。

リソースの解放と確保やタイマーやコールバックのキャンセルと登録についても、BREWは何もしてくれません。

EVT_APP_SUSPEND イベント ( サスペンド時 ) や EVT_APP_RESUME イベント ( レジューム時 ) に対するイベントハンドリングの処理としてプログラミングしなければいけません。

また、レジューム時には画面の再描画も必要です。