ホーム > デベロッパ > SophiaFramework > BREW C++ 逆引きコード集

BREW C++ プログラミング 逆引きコード集 : 開発環境

C++ で作成されたBREW アプリを作成する際の、Visual Studio などの開発環境のTipsです。
SophiaFramework を用いています。

BREW 3.1 端末でHTTPS 通信を高速化する方法

QUALCOMM 社の情報によりますと、 BREW3.1.2 以前の実装では、ISSL インターフェースが過剰にパケットを細分化するため HTTPS 通信のパフォーマンスが劣化するらしいです。(参照:関連情報)

この問題を解決するためには、 下記のように SFXHTTPConnection クラスを開いてから接続するまでの間に、 SFXHTTPConnection クラスが内部で保持する SFBWeb インスタンスを取得して、この問題が解決されている ISSL インターフェースのクラス ID「AEECLSID_SSL_101」を渡すようにします。

なお、関連情報には、 『本機能は利用例が少なく、十全な評価がされていないため、使用のリスクは御社でご判断下さい』とあります。

#include "AEESSL_WEBOPT_CLASSID.h"
#include "ISSL.bid"

_http.Open()

SFBWebOpts webopts = SFBWebOpts::NewInstance(&error);
WebOpt opt[2];
opt[0].nId = WEBOPT_SSL_CLASSID;
opt[0].pVal = (VoidPtr)AEECLSID_SSL_101;
opt[1].nId = WEBOPT_END;
opt[1].pVal = null;
webopts->AddOpt(opt);
SFBWebSmp web = _http.GetSFBWeb();
web->AddOpt(opt);

_http.Connect(url, XALLBACK_INTERNAL(OnConnect));

※ 接続時間が短縮されたもののフェッチに時間がかかる場合は、ストリームリーダーのバッファサイズを小さくしてみてください。たとえば、4096バイト(デフォルト)を2048バイトにすることで高速化された例があります。

      

ライセンスコードを設定したが、アプリが起動しないのですが…?

ラインセンスコードを設定してアプリを起動すると、「アプリが起動できませんでした。」というエラーメッセージが端末に表示されるのですが…?

対応策:
ライセンスコードと ClassID は一対一に対応します。設定したライセンスコードに対応する ClassID がアプリに正しく設定されているか確認してください。

      

RVCT for BREW 1.2 で、「-g-」オプションでビルドするとリンクエラーが発生するのですが・・・?

RVCT for BREW 1.2 で、「-g-」オプションでビルドすると、下記のクラスに関してリンクエラーが発生するのですが、どうすれば宜しいですか?

■対応方法:

RVCT for BREW 1.2 で「-g-」オプションでビルドする場合、最適化オプション -Ospace を -Otime に変えてみてください。


※この問題は、RVCT for BREW 1.2 に付属するリンカの特性と考えられます。

      

usertype.dat の上書きについて

SophiaFramework UNIVERSE をインストールすると、Microsoft Visual Studio 用のキーワードファイル「usertype.dat」が SophiaFramework UNIVERSE 用に上書きされます。

usertype.dat をカスタマイズしてお使いの場合は、インストールする前にこのファイルをバックアップしてください。

デフォルトインストール時の usertype.dat の位置は以下の通りです。

  1. Microsoft Visual Studio 6.0:
    C:\Program Files\Microsoft Visual Studio\Common\MSDev98\Bin
  2. Microsoft Visual Studio .NET 2003:
    C:\Program Files\Microsoft Visual Studio .NET 2003\Common7\IDE
  3. Microsoft Visual Studio 2005:
    C:\Program Files\Microsoft Visual Studio 8\Common7\IDE
      

コンパイルできない (インクルードファイルのエラー)

以下のエラーメッセージが出て、コンパイルできないときは、インクルードディレクトリの設定を確認してください。

fatal error C1083: インクルードファイルがオープンできません。'SophiaFramework.hpp'

確認手順:(BREW SDK 4.0 以外の場合は、BREW SDK のバージョンに応じたライブラリファイルのパスを設定してください)

Visual C++ 6.0 の場合

Step 1.メニューから [プロジェクト] -> [設定] を選択する。

Step 2. [インクルードファイルのパスを確認する。

1) [C/C++] タブを選択する。

2) [カテゴリ] の項目から [プリプロセッサ] を選択する。

3) [インクルードファイルのパス] の入力に

$(BREWDIR)\inc;$(SFHOME)\Include 

が無い場合、これを手動で追加する。

Step 3. ライブラリファイルのパスを確認する。

1) [リンク] タブを選択する。

2) [オブジェクト/ライブラリ モジュール] の入力に

$(SFHOME)\Library\SophiaFrameworkBrew400JpnVC60.lib 

が無い場合、これを手動で追加する。

Visual Studio .NET 2003 の場合

Step 1.メニューから [プロジェクト] -> [プロパティ] を選択する。

Step 2. [インクルードファイルのパスを確認する。

1) [構成プロパティ] -> [C/C++] -> [全般] を選択する。

2) [追加のインクルード ディレクトリ] の入力に

$(BREWDIR)\inc;$(SFHOME)\Include 

が無い場合、これを手動で追加する。

Step 3. ライブラリファイルのパスを確認する。

1) [構成プロパティ] -> [リンカ] -> [入力] を選択する。

2) [追加の依存ファイル] の入力に

$(SFHOME)\Library\SophiaFrameworkBrew400JpnVCNET2003.lib

が無い場合、これを手動で追加する。

Visual Studio 2005 の場合

Step 1.メニューから [プロジェクト] -> [プロパティ] を選択する。

Step 2. [インクルードファイルのパスを確認する。

1) [構成プロパティ] -> [C/C++] -> [全般] を選択する。

2) [追加のインクルード ディレクトリ] の入力に

$(BREWDIR)\inc;$(SFHOME)\Include 

が無い場合、これを手動で追加する。

Step 3. ライブラリファイルのパスを確認する。

1) [構成プロパティ] -> [リンカ] -> [入力] を選択する。

2) [追加の依存ファイル] の入力に

$(SFHOME)\Library\SophiaFrameworkBrew400JpnVC2005.lib

が無い場合、これを手動で追加する。

      

リファレンスに記載されていないエラー番号の内容は … ?

SophiaFramework が返すエラー ( SFCError 型 ) に関して、その番号が [ 0x0000 〜 0x3FFF ] の範囲にあるものでリファレンスに記載のないものは BREW プラットフォームが返したエラーです。

これらのエラーの詳細内容については、BREW SDK に含まれる AEEError.h というファイルをご覧になってください。

      

VC6 で ClassView にクラスリストが表示されないのですが ・・・ ?

Microsoft Visual Studio C++ 6.0 には、ClassView パーサのマクロ処理に関して不具合があります。

現時点で、ヘッダファイル内コンストラクタの static_throws マクロが原因となって Microsoft Visual Studio C++ 6.0 の ClassView にクラスリストが表示されないことが分かっています。

この場合の回避策は以下のとおりです。

回避策 1. static_throws マクロの記述を削除します。

static_throws マクロはコンパイル時に削除されますので、削除しても実行時に影響は及びません。

( 開発者に例外を搬出する可能性があることを明示しているだけなので )

回避策 2. ヘッダファイルの先頭の方で

#define static_throws

と記述します。

回避策 1. または 2. により、ClassView にクラスリストは正常に表示されるようになります。

# Microsoft Visual Studio C++ 6.0 では ClassView 関連の不具合のため、他にも正常にパースできない可能性があります。 ClassView にクラスリストを表示する必要性が高い場合は、Microsoft Visual C++ .NET2003 をご利用ください。Microsoft Visual C++ .NET2003 では正常に動作します。

      

BREW SDK 4.0.0 で開発する方法 (SophiaFramework 4.1.7)

SophiaFramework 4.1.7 から、BREW SDK 4.0.0 用新規プロジェクトを作成できるようになりました。CheckAvail 関数が BREW SDK 4.0.0 では正常に動作しないため、BREW SDK 4.0.0 を使う場合、サンプルコードで CheckAvail 関数が呼び出されないように変更しました。また、BREW SDK 4.0.0 ではモジュール名が 21 文字を超えると発生するエラーとなるため、すべてのサンプルコードのモジュール名を 21 文字以下としました。

※制約事項:
BREW SDK 4.0.0 API のラッパーは提供されていません。SophiaFramework 4.1.8 以降で、提供する予定です。

■ BREW SDK 4.0.0 で開発する手順

Step 1 : Qualcomm 社サイトから BREW 4.0.0 SDK をダウンロードし、インストールします。

Step 2 : SophiaFramework 4.1.7 をインストールします。

Step 3 : 環境変数を更新するため、再起動します。

Step 4 : SophiaFramework のリンカのファイルを変更します。

Visual C++ 6.0 の場合 :
[プロジェクト] -> [設定] -> [リンク] -> [オブジェクト / ライブラリ モジュール] で [SophiaFrameworkBrew310VC6.lib] を [SophiaFrameworkBrew400VC6.lib] に変更します。

.NET の場合 :
[プロジェクト] -> [(プロジェクト名)のプロパティ] -> [リンカの入力] -> [追加の依存ファイル] で [SophiaFrameworkBrew310NET.lib] を [SophiaFrameworkBrew400NET.lib] に変更します。

Step 5 : アプリをコンパイルします。

※ AEEIramCache および AEEIRecordStore に関してコンパイラ エラーが発生します。このエラーは、BREW SDK 4.0.0 の不具合です。

以下のように変更すれば、コンパイラ エラーを回避できます。

■変更前 

static __inline int IRAMCACHE_Find(IRamCache* piRamCache,
                                   const char* cpKey, int nKeyLen,
                                   void* pVal, int* pnValLen)
 
 {
     return AEEGETPVTBL(piRamCache,IRamCache)
           ->Find(piRamCache,
                  cpKey, nKeyLen,
                  pVal, pnValLen);
}


■変更後 

static __inline int IRAMCACHE_Find(IRamCache* piRamCache,
                                   const char* cpKey, int nKeyLen,
                                   void* pVal, int* pnValLen)
{
    return AEEGETPVTBL(piRamCache,IRamCache)
            ->Find(piRamCache,
                   cpKey, nKeyLen,
                   static_cast<char *>(pVal), pnValLen);
}
■変更前 

static __inline int IRECORDSTORE_Find(IRecordStore* piRecordStore,
                                     const char* cpKey, int nKeyLen,
                                     void* pVal, int* pnValLen)
{
    return AEEGETPVTBL(piRecordStore,IRecordStore)
           ->Find(piRecordStore,
                  cpKey, nKeyLen,
                  pVal, pnValLen);
}


■変更後 

static __inline int IRECORDSTORE_Find(IRecordStore* piRecordStore,
                                         char* cpKey, int nKeyLen,
                                         void* pVal, int* pnValLen)
{
    return AEEGETPVTBL(piRecordStore,IRecordStore)
           ->Find(piRecordStore,
                  cpKey, nKeyLen,
                  static_cast<char *>(pVal), pnValLen);
}

Step 6 : もう一度、コンパイルします。

【注意事項】

1) SophiaFramework 4.1.7 では BREW 4.0.0 API ラッパーは提供されていません。

[対策] SophiaFramework 4.1.8 以降で提供される予定です。

2) BREW 4.0.0 SDK には KDDI_FONT_FIXED16X16 が含まれないため、pclock アプリはコンパイルできません。

      

BREW SDK 4.0.0 で開発する方法 (SophiaFramework 4.1.6)

SophiaFramework 4.1.6 では、一部 BREW SDK 4.0.0 に対応しています。BREW SDK 3.1 以前の環境で開発した SophiaFramework アプリをコンパイルし実行できます。

※制約事項:
BREW SDK 4.0.0 用の新規プロジェクトは作成できません。また、BREW SDK 4.0.0 API のラッパーも提供されていません。SophiaFramework 4.1.7 以降で、提供する予定です。

■ BREW SDK 4.0.0 で開発する手順

Step 1 : Qualcomm 社サイトから BREW 4.0.0 SDK をダウンロードし、インストールします。

Step 2 : SophiaFramework 4.1.6 をインストールします。

Step 3 : 環境変数を更新するため、再起動します。

Step 4 : SophiaFramework のリンカのファイルを変更します。

Visual C++ 6.0 の場合 :
[プロジェクト] -> [設定] -> [リンク] -> [オブジェクト / ライブラリ モジュール] で [SophiaFrameworkBrew310VC6.lib] を [SophiaFrameworkBrew400VC6.lib] に変更します。

.NET の場合 :
[プロジェクト] -> [(プロジェクト名)のプロパティ] -> [リンカの入力] -> [追加の依存ファイル] で [SophiaFrameworkBrew310NET.lib] を [SophiaFrameworkBrew400NET.lib] に変更します。

Step 5 : アプリをコンパイルします。

※ AEEIramCache および AEEIRecordStore に関してコンパイラ エラーが発生します。このエラーは、BREW SDK 4.0.0 の不具合です。

以下のように変更すれば、コンパイラ エラーを回避できます。

■変更前 

static __inline int IRAMCACHE_Find(IRamCache* piRamCache,
                                   const char* cpKey, int nKeyLen,
                                   void* pVal, int* pnValLen)
 
 {
     return AEEGETPVTBL(piRamCache,IRamCache)
           ->Find(piRamCache,
                  cpKey, nKeyLen,
                  pVal, pnValLen);
}


■変更後 

static __inline int IRAMCACHE_Find(IRamCache* piRamCache,
                                   const char* cpKey, int nKeyLen,
                                   void* pVal, int* pnValLen)
{
    return AEEGETPVTBL(piRamCache,IRamCache)
            ->Find(piRamCache,
                   cpKey, nKeyLen,
                   static_cast<char *>(pVal), pnValLen);
}
■変更前 

static __inline int IRECORDSTORE_Find(IRecordStore* piRecordStore,
                                     const char* cpKey, int nKeyLen,
                                     void* pVal, int* pnValLen)
{
    return AEEGETPVTBL(piRecordStore,IRecordStore)
           ->Find(piRecordStore,
                  cpKey, nKeyLen,
                  pVal, pnValLen);
}


■変更後 

static __inline int IRECORDSTORE_Find(IRecordStore* piRecordStore,
                                         char* cpKey, int nKeyLen,
                                         void* pVal, int* pnValLen)
{
    return AEEGETPVTBL(piRecordStore,IRecordStore)
           ->Find(piRecordStore,
                  cpKey, nKeyLen,
                  static_cast<char *>(pVal), pnValLen);
}

Step 6 : もう一度、コンパイルします。

【注意事項】

1) SophiaFramework 4.1.6 では、BREW 4.0.0 用の新規プロジェクトを作成できません。

[対策] SophiaFramework 4.1.7 以降で対応いたします。

2) SophiaFramework 4.1.6 では BREW 4.0.0 API ラッパーは提供されていません。

[対策] SophiaFramework 4.1.8 以降で提供される予定です。

3) BREW 4.0.0 用シミュレータでアプリ起動すると Unknown Error(1) が発生します。

以下のサンプルアプリで発生します。

−SyncScheduler
−psec
−Recog
−pself_dom
−pself_sax

[原因] CheckAvail 関数が BREW 4.0.0 では正常に動作しないためです。

[対策] CheckAvail 関数を使わなければ正常に動作します。

4) BREW 4.0.0 用シミュレータでアプリ起動すると Unknown Error(14) が発生します。

以下のサンプルコードで発生します。

−SFXCollectionExplainer
−SFXMathematicsExplainer

[原因] モジュール名が 21 文字を超えると発生するエラーです。

[対策] BREW 4.0.0 SDKでは、モジュール名は 21 文字以下にします。

5) BREW 4.0.0 SDK には KDDI_FONT_FIXED16X16 が含まれないため、pclock アプリはコンパイルできません。

      

RealView Compilation Tools for BREW V1.2 の Build 848 patch の入手方法

RealView Compilation Tools for BREW V1.2 の Build 848 patch を入手方法は以下の手順です。

パッチの入手方法

1:ARM社TECHNICAL SUPPORT ページを開きます。
2:「DOWNLOADS」のリンクをクリックします。
3:ダウンロード一覧の上部にある「ARM Developer Suite」の中の、「ADS 1.2」のリンクをクリックします。
4:ADS 1.2 用のダウンロード一覧の下部にある、「ADS 1.2: Build 848 patch for Windows」のリンクをクリックします。
5:パッチについての説明が書かれたページが開きますが、そのページの下部にある「Download (8736 Lb Zip) >>」のリンクをクリックします。
6:パッチに関する使用許諾書が表示されるので、熟読した上で、ページ下部にある「I agree」ボタンをクリックします。
7:ファイルの処理方法を尋ねるダイアログが表示されるので、ディスクに保存するようにして、保存先に適当な場所を選択してください。


パッチの適用手順

1:ダウンロードした 4554.exe を実行します。
2:"Unzip to folder:"に、適当なフォルダを選択します。ここで指定したフォルダに、パッチが展開されます。
3:「Unzip」ボタンをクリックします。
4:"82 file(s) unzipped successfully."というダイアログが表示されるので、「OK」ボタンをクリックします。
5: 1 で開いたダイアログの「Close」ボタンをクリックします。
6: 2 で指定したフォルダに展開されたフォルダ、およびファイルを、RealView Compilation Tools for BREW V1.2のフォルダ内にコピーします。
通常このフォルダは、
C:\Program Files\ARM\RVCT_BREWv1_2
です。
7:上書きの確認ダイアログが表示された場合は、「すべて上書き」をクリックします。

      

BREW SDK 3.1.5の開発環境について

SophiaFramework は BREW SDK v3.1.5 については動作保障を行っておりません。
BREW SDK 3.1.2日本語版をご使用ください。

BREW SDK 変更手順

1:BREW SDK v3.1.5 および BREW SDK v3.1.2 Ja のアンインストールを行ってください。
[設定]-[コントロールパネル]-[プログラムの追加と削除] から BREW SDK バージョン名 を選択し削除します。
2:BREW SDK v3.1.2 Jaを再インストールしてください。

      

Microsoft Visual C++6.0 の開発環境について

Microsoft Visual C++6.0 で Service Pack 6 以前の開発環境の場合、コンパイルできない可能性があります。
Service Pack 6 を入手しコンパイラ アップデートを行ってください。

<コンパイラ アップデートの入手方法と適用方法>

Service Pack の入手方法
1:Microsoft 社Microsoft Visual Studio 製品 ダウンロード情報ページを開きます。
2:製品一覧の中の、「Visual Studio 6.0」をクリックします。
3:Visual Studio 6.0 用 Service Pack 一覧の中の、「Visual Studio 6.0 Service Pack 6」をクリックします。
4:新しく開いたページの中程にある、「Visual Studio 6.0 Service Pack 6 の入手方法」のリンクをクリックします。
5:「Web サイトからのダウンロード」の一覧の中にある、「Full 版」のリンクをクリックします。
6:「言語の変更 :」が「日本語」になっていることを確認します。もし「日本語」になっていなければ「日本語」に変更してください。
7:「ダウンロード」ボタンをクリックします。ファイルの処理方法を尋ねるダイアログが表示された場合は、ディスクに保存するようにして、保存先に適当な場所を選択してください。

Service Pack のインストール
1:ダウンロードした Vs6sp6.exe を実行します。
2:ファイルの展開先フォルダを尋ねるダイアログが表示されるので、展開先を指定して、「OK」ボタンをクリックします。
3:上で展開先に指定したフォルダを開き、その中にある setupsp6.exe を実行します。
4:インストーラの指示に従って、Service Pack のインストールを完了します。

      

異なるバージョンの SophiaFramework を同時に使う

異なるバージョンの SophiaFramework を同時にインストールして使うことができます。
(ライセンス上の問題はございません)

アプリをコンパイルするときに読み込むヘッダファイルとライブラリファイルを、直接指定する限り問題は起きません。

SophiaFramework 3.0 以降はインストーラがいくつかの環境変数とレジストリを設定します。また、VisualStudio C++ 6.0 / .NET 2003 の環境設定ファイルを編集し、アプリウィザードなどの機能拡張モジュールをインストールします。

旧バージョンがインストールされている状態で新バージョンをインストールすると、これら設定が上書きされる可能性があります。

複数バージョンをインストールする場合の具体的な手順は、

1.SophiaFramework 2.x をインストールします。

2.SophiaFramework 3.x をインストールします。
(インストーラの設定でカスタムインストールを選択し、
ヘッダファイルとライブラリ、リファレンスなど必要最小限の
ファイルだけインストールします。)

3.SophiaFramework 4.x をインストールします。
(インストーラの設定で標準インストールです。)

4.この状態では、アプリウィザードや機能拡張モジュールは
 4.x のものが利用できます。

5.古いバージョンの SophiaFramework を参照するアプリは、コンパイル時の
ヘッダファイルやライブラリのパスを直接指定します。

      

ARM のリンケージでエラーが発生する

ARM のリンケージでエラーが発生する場合は、以下の項目をご確認ください。

1. RVCTB のビルドバージョン (コマンドラインで armcpp と入力する)

SophiaFramework では、RealView Compilation Tools for BREW 1.2 の Build 848 が必要です。

2. ARM 用のメイクファイルのコンパイラオプション

OPT = -Ospace -O2 --no_inlinemax

になっている場合、-Ospace を -Otime に変えてみる。

      

コードの実行速度をミリ秒単位で計測する

SFXDate::CurrentDate 関数で取得できる時刻は秒単位です。
時間をミリ秒単位で取得するには、SFXHelper::gettimems を使用します。

UInt32 startms = SFXHelper::gettimems();

func();  // 測定したい処理

UInt32 endms = SFXHelper::gettimems();
SInt32 milisecTime = endms - startms;  // milisecTime は
                                       // 測定した時間(ミリ秒単位)

参照 SFXHelper::gettimems

      

実行されるコードをエミュレータと実機で分岐する

実行されるコードをエミュレータと実機で分岐するには、
TARGET_ENVIRONMENT_SIMULATOR マクロと TARGET_ENVIRONMENT_PHYSICAL マクロを
使用します。

#if defined(TARGET_ENVIRONMENT_SIMULATOR)
// ここにエミュレータ用に実行されるコードを記述する

#endif
#if defined(TARGET_ENVIRONMENT_PHYSICAL)
// ここの実機用に実行されるコードを記述する

#endif

参照 TARGET_ENVIRONMENT_SIMULATOR | TARGET_ENVIRONMENT_PHYSICAL