Androidアプリ開発の基礎的な情報や注意点など


 ここでは Androidアプリ開発に関するの基礎的な情報や注意点などを載せます。

1.Androidアプリで使用するファイルの追加方法

2.Androidアプリで使用する文字コードは『UTF-8』であることについて

3.Androidアプリのセーブファイルを保存するフォルダーパスについて

4.Androidアプリではグローバル変数が 0 で初期化されることを前提としてはいけないことについて

5.Androidアプリでは char は符号なし( unsigned )型です

6.定義済みマクロ __ANDROID__ を使った Windowsアプリとのプログラムファイルの共有について



1.Androidアプリで使用するファイルの追加方法

   Windowsソフトではソフトで使用する画像ファイルやサウンドファイルは実行ファイルと同じフォルダや、
  実行ファイルと同じフォルダに置いたフォルダの中に配置したりしますが、Androidアプリはビルドすると
  拡張子 apk のファイルにアプリの実行に必要なファイルが全部入る仕組みになっているため、
  Windowsソフトと異なり Androidアプリはアプリ内で使用するファイルを Androidアプリのプロジェクトに
  VisualStudio Community 2015 の『ソリューションエクスプローラー』を使用して追加
する必要があります。

   以下にその手順を載せます。

  @ VisualStudio Community 2015 で Androidアプリのプロジェクトを開いた状態では、
    『ソリューションエクスプローラー』と書かれているリストには『(プロジェクト名).Packaging』
    書かれている項目がありますので、そこで右クリックをして表示されるプルダウンメニューから
    『追加(D)』→『新しいフォルダー(D)』を選択して『(プロジェクト名).Packaging』の下に
    一つフォルダーを追加
します。

  A 追加したフォルダーは『新しいフォルダー』となっていますので、右クリックして表示される
    プルダウンメニューから『名前の変更(M)』を選び名前を『assets』に変更します。

  B 『assets』フォルダーを右クリックして表示されるプルダウンメニューから『追加(D)』→『既存の項目(G)』
    選択するとファイルを選択するウインドウが表示されますので、ここでアプリで使用したい画像ファイルや
    サウンドファイルを選択してから『追加(A)』ボタンをクリック
して『assets』フォルダに追加します。

   以上です、これで『(プロジェクト名).Packaging』の下に作った『assets』フォルダーに追加したファイルは
  Androidアプリの apkファイルに含まれる
ことになり、Androidアプリのプログラム内で LoadGraph や
  LoadSoundMem などの関数を使用して読み込めるファイル
となります。

  あと、『assets』フォルダに含まれるファイルに関する注意点や補足は以下の通りです。


    LoadGraph や LoadSoundMem で参照されるフォルダは『assets』フォルダです

      つまり『assets』フォルダに『Test.bmp』というファイルを入れた場合、LoadGraph で読み込む際のパスは
      LoadGraph( "Test.bmp" ) ; となります。( LoadGraph( "assets\\Test.bmp" ) ; ではありません )

    apk ファイルに含めることができるファイルのファイル名で使用できる文字は半角文字の英数字・一部記号文字のみです

      全角文字の英数字・記号・日本語などはビルドの際に『認識できない文字』としてエラーになってしまいますので
      注意してください。

    Windowsソフトと異なり英語の大文字・小文字が区別されます

      Windowsソフトでは『Test.bmp』というファイルを読み込む際は LoadGraph( "test.bmp" ) ; と記述しても
      LoadGraph( "TEST.BMP" ) ; と記述しても正常に読み込むことができますが、Androidアプリでは大文字と小文字は
      区別される
ので正確に LoadGraph( "Test.bmp" ) ; と記述する必要があります。

    ファイルの削除や追加はすべて VisualStudio Community 2015 の『ソリューションエクスプローラー』上で行う必要があります

      『assets』フォルダに追加したファイルやフォルダは、プロジェクトの実際のフォルダ内に追加されるため、
      Windows標準ソフトの『エクスプローラー』などで確認することができてしまいますが、
      VisualStudio Community 2015 がビルド時に apk ファイルに含めてくれるのはあくまで
      VisualStudio Community 2015 内の『ソリューションエクスプローラー』を使用して
      追加・削除されたファイル・フォルダのみ
ですので、必ず apk ファイルに含めたいファイルの追加や削除は
      VisualStudio Community 2015 の『ソリューションエクスプローラー』を使用して行うようにしてください

      ( 『エクスプローラー』上の『assets』フォルダに直接ファイルやフォルダを追加したり削除したりしても、
       無視されてしまいます
)

    『assets』フォルダに追加したファイルは、コピーが作成されます

      つまり、『assets』フォルダに追加したファイルに対して、追加後に内容を変更しても『assets』フォルダに追加した
      ファイルにはその変更は反映されません
ので、その変更を『assets』フォルダ内のファイルにも反映したい場合は
      一度『ソリューションエクスプローラー』上で『assets』フォルダ内の該当のファイルを削除して、改めてファイルを
      『assets』フォルダに追加する操作を行う必要
があります。

    『assets』フォルダに追加したファイル名の大文字・小文字を『ソリューションエクスプローラー』上で変更しても反映されないことがあります

      そのため、『ソリューションエクスプローラー』上に表示されている大文字・小文字の通りにファイル名を指定しても
      読み込みに失敗することがあります。
      このような場合は、一度『ソリューションエクスプローラー』から該当するファイル・フォルダを削除して、
      改めてファイル・フォルダを追加する必要
があります。



2.Androidアプリで使用する文字コードは『UTF-8』であることについて

   普段何気なく使用している txt, cpp, h などのテキストファイルは特に指定をせずに保存すると
  文字コード『シフトJIS』形式で保存されますが、Androidアプリが対応しているのは文字コード『UTF-8』形式なので、
  cpp, h などのプログラムソースファイルやアプリ内で使用するテキストファイルを
  文字コード『UTF-8』形式で保存する必要があります。

   あと、『シフトJIS』形式の文章データを 1文字単位で扱う処理に慣れている方は『UTF-8』『シフトJIS』
  文字の数値やサイズが異なることにも注意が必要です。

   というのも、『シフトJIS』では半角文字は 1バイト、全角文字は 2バイトなのに対し、『UTF-8』では半角文字は同じく
  1バイトですが、全角文字は概ね 3バイトと、全角文字のバイト数が異なる他、「全角文字なのか、半角文字なのか」の
  判別方法も異なる
からです。
  ( 因みに 1文字のバイト数については、DXライブラリの 1文字のバイト数を取得するための関数『GetCharBytes』を
   使用すると便利です )

   この他、主に WindowsアプリAndroidアプリ移植する際に文字コード関連で必要な作業や、文字コードの詳しい解説を
  こちらに纏めましたので、よろしければご覧ください。

  『WindowsアプリとAndroidアプリでは使用する文字コードが異なることについて



3.Androidアプリのセーブファイルを保存するフォルダーパスについて

   Androidアプリで RPG のセーブデータや STG のスコアデータを保存したりするフォルダのパスを取得するには
  Android専用の関数『GetInternalDataPath』を使用します。
// アプリのデータ保存用のフォルダーパスを取得する // PathBuffer : フォルダーパスを保存する char 型配列のアドレス // PathBufferBytes : フォルダーパスを保存する char 型配列のサイズ( バイト単位 ) int GetInternalDataPath( char *PathBuffer, int PathBufferBytes ) ;
   取得できるフォルダーパスは『/data/data/com.DxLibTest/files』のような文字列となっているので、これを
  使用して fopen でセーブファイルなどを開く場合は以下のようにします。
FILE *fp ; char FilePath[ 256 ] ; // GetInternalDataPath でデータセーブ用のフォルダーパスを取得 GetInternalDataPath( FilePath, sizeof( FilePath ) ) ; // 『スラッシュ文字 + セーブファイルパス』を文字列の後ろに付ける strcat( FilePath, "/SaveFile.bin" ) ; // ファイルを書き込み新規作成( "wb" )で開く( 読み込みの場合は "rb" ) fp = fopen( FilePath, "wb" ) ; // ファイルが開けたかチェック if( fp != NULL ) { // ファイルが開けた 〜〜〜〜 fread や fwrite でファイルを読み込み、又は書き込み 〜〜〜〜 // ファイルを閉じる fclose( fp ) ; }
   因みに、この関数で取得できるパスが示すフォルダは Root権限を取得しないとファイルエクスプローラーなどの
  アプリを使用しても中身を閲覧することができないフォルダ
となっていますので、デバッグ情報やリプレイファイルなど
  プレーヤーにも閲覧できるファイルを保存するためのフォルダのパスを取得したい場合は同じく Android専用の関数
  『GetExternalDataPath』を使用します。
// アプリの外部データ保存用のフォルダーパスを取得する // PathBuffer : フォルダーパスを保存する char 型配列のアドレス // PathBufferBytes : フォルダーパスを保存する char 型配列のサイズ( バイト単位 ) int GetExternalDataPath( char *PathBuffer, int PathBufferBytes ) ;
   取得できるフォルダーパスは『/storage/sdcard/Android/data/com.DxLibTest/files』のような文字列で、
  このパス通りの位置にあるフォルダ内に作成したファイルはファイルエクスプローラーなどのアプリで閲覧することができます。



4.Androidアプリではグローバル変数が 0 で初期化されることを前提としてはいけないことについて

   Windowsアプリではプログラム起動直後はグローバル変数は 0 で初期化されていますが、Androidアプリでは
  0 で初期化されているとは限りません、何故ならアプリを終了してもメモリが解放されず、同じアプリを起動した
  際に同じメモリ領域が初期化されずに使い回されることがある
からです。

   なので、グローバル変数は『前回プログラムを動作させたときに最後に代入した値』が入っている可能性が
  ありますので、『プログラム起動時にグローバル変数は必ず 0 で初期化されている』ことを前提としたプログラムは
  組まないように注意
してください。



5.Androidアプリでは char は符号なし( unsigned )型です

   Windowsアプリでは char 型は、char c ; のように記述すると符号あり( signed )型になり、
  持てる値は -128 〜 127 となりますが、Androidアプリでは同じように char c ; と記述しても符号なし( unsigned )型になり、
  持てる値は 0 〜 255 となります。

   何故かというと、もともと char 型は、char とだけ記述した場合に符号あり( signed )型になるか符号なし( unsigned )型に
  なるかは決まっておらず
、たまたま Windows環境では符号ありとなっていて、たまたま Android環境では符号なしとなっているからです。

   ただ、Androidアプリでも signed char c ; のように、char の前に signed を記述して『符号ありの char 型である!』と明記すれば
  符号ありの char型となりますので、もし char 型変数を文字を代入する変数としてではなく、値を代入する変数として使用する場合は
  signed charunsigned char のように char の前に符号の有り無しを明記するようにしてください。



6.定義済みマクロ __ANDROID__ を使った Windowsアプリとのプログラムファイルの共有について

   Androidアプリの cpp ファイルをコンパイルする際は、特に指定が無くても『__ANDROID__』というマクロが
  定義されていますので、これを使って Windowsアプリと Androidアプリでソースファイルを共有することができます。

   例えば、プログラムのエントリーポイントは Windowsアプリの場合は WinMain関数、Androidアプリは android_main関数
  なので、これを『__ANDROID__』が定義されているかどうかで以下のようにコンパイルされるコードを分ければ
  Windowsアプリでも Androidアプリでも使用できる cpp ファイルになります。
#include "DxLib.h" #ifdef __ANDROID__ // Android版のコンパイルだったら android_main int android_main( void ) #else // Windows版のコンパイルだったら WinMain int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) #endif { int GrHandle ; #ifndef __ANDROID__ // Windows版のコンパイルだったら ChangeWindowMode を実行する ChangeWindowMode( TRUE ) ; #endif // DXライブラリ初期化処理 if( DxLib_Init() == -1 ) { // エラーが起きたら直ちに終了 return -1 ; } // BMP画像の読み込み GrHandle = LoadGraph( "test1.bmp" ) ; // 描画先を裏画面に変更 SetDrawScreen( DX_SCREEN_BACK ) ; // 背景色をグレーに変更 SetBackgroundColor( 128, 128, 128 ) ; // メインループ while( ProcessMessage() == 0 ) { // 画面をクリア ClearDrawScreen() ; // BMP画像の描画 DrawGraph( 0, 0, GrHandle, TRUE ) ; // 裏画面の内容を表画面に反映 ScreenFlip() ; } // DXライブラリ使用の終了処理 DxLib_End() ; // ソフトの終了 return 0 ; }



戻る