#include "DxLib.h"
#include <string.h>
int android_main( void )
{
JNIEnv *env ;
const ANativeActivity *NativeActivity ;
int StorageState = 0 ;
// 背景を灰色にする
SetBackgroundColor( 128,128,128 ) ;
// DXライブラリの初期化
if( DxLib_Init() < 0 ) return -1 ;
// 描画先を裏画面に変更
SetDrawScreen( DX_SCREEN_BACK ) ;
// アプリの NativeActivity を取得しておく
NativeActivity = GetNativeActivity() ;
// Java の関数 CheckStoragePermission の呼び出し
{
// JavaVM とソフト実行用スレッドを関連付け( C++ から Java の機能を使用するために必要 )
if( NativeActivity->vm->AttachCurrentThreadAsDaemon( &env, NULL ) != JNI_OK )
{
return -1 ;
}
// Java のクラス MainActivity を取得
jclass jclass_MainActivity = env->GetObjectClass( NativeActivity->clazz ) ;
// Java のクラス MainActivity のメンバー関数 CheckStoragePermission の ID を取得
jmethodID jmethodID_CheckStoragePermission = env->GetMethodID( jclass_MainActivity, "CheckStoragePermission", "()V" ) ;
// Java のクラス MainActivity のメンバー関数 CheckStoragePermission の呼び出し
env->CallVoidMethod( NativeActivity->clazz, jmethodID_CheckStoragePermission ) ;
// Java のクラス MainActivity の参照を削除
env->DeleteLocalRef( jclass_MainActivity ) ;
// JavaVM とソフト実行用スレッドの関連付け終了
NativeActivity->vm->DetachCurrentThread() ;
}
// ストレージ使用が許可されるか、拒否されるまでループ
while( ProcessMessage() == 0 && StorageState == 0 )
{
// 裏画面の内容をクリア
ClearDrawScreen() ;
// JavaVM とソフト実行用スレッドを関連付け( C++ から Java の機能を使用するために必要 )
if( NativeActivity->vm->AttachCurrentThreadAsDaemon( &env, NULL ) != JNI_OK )
{
return -1 ;
}
// Java のクラス MainActivity を取得
jclass jclass_MainActivity = env->GetObjectClass( NativeActivity->clazz ) ;
// Java のクラス MainActivity のメンバー変数 mStorageState の ID を取得
jfieldID jfieldID_mStorageState = env->GetFieldID( jclass_MainActivity, "mStorageState", "I" ) ;
// Java のクラス MainActivity のメンバー変数 mStorageState の値をローカル変数 StorageState に代入
StorageState = env->GetIntField( NativeActivity->clazz, jfieldID_mStorageState ) ;
// Java のクラス MainActivity の参照を削除
env->DeleteLocalRef( jclass_MainActivity ) ;
// JavaVM とソフト実行用スレッドの関連付け終了
NativeActivity->vm->DetachCurrentThread() ;
// メッセージを表示
DrawString( 0, 0, "ストレージ使用の許可待ち中", GetColor( 255,255,255 ) ) ;
// 裏画面の内容を表画面に反映
ScreenFlip() ;
}
// ストレージ使用が許可されたかどうかで処理を分岐
ClearDrawScreen();
if( StorageState == 2 )
{
// ストレージ使用が許可されなかった場合
DrawString( 0, 0, "ストレージ使用は拒否されました", GetColor( 255,255,255 ) ) ;
}
else
{
// ストレージ使用が許可された場合はダウンロードフォルダ内のファイルのサイズを取得( ファイルのパスは仮です )
LONGLONG FileSize = FileRead_size( "/storage/emulated/0/Download/test.bin" );
DrawFormatString( 0, 0, GetColor( 255,255,255 ), "ストレージ使用は許可されました ファイルサイズ : %dbyte", ( int )FileSize );
}
ScreenFlip();
WaitKey();
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
以上です。
これでプロジェクトを実行すると、画面にストレージが使用可能かや、使用可能な場合はファイルのサイズが表示されます。
( ファイルのサイズが正常に表示されるには "/storage/emulated/0/Download/test.bin" ←こちらの部分を実際に存在するファイルのパスにする必要がありますが… )
詳細は割愛しますが、C++ から Java にアクセスする基本的な流れは。
① AttachCurrentThreadAsDaemon でソフト実行用スレッドと JavaVM を関連付け、JNIEnv も取得。
② GetObjectClass でアプリの Java クラスを取得。
③ GetMethodID や GetFieldID で Java の関数や変数の ID を取得。
④ Call???Method や Get???Field で Java の関数の呼び出しや変数の値を取得。
⑤ DeleteLocalRef で Get???Field で取得したオブジェクト系の変数の参照を削除。
⑥ DeleteLocalRef で GetObjectClass で取得したアプリの Java クラスの参照を削除。
⑦ DetachCurrentThread でソフト実行用スレッドと JavaVM の関連付けを終了。
となります。
C++ と Java でのやり取りを行う機能( JNI( Java Native Interface ) ) の詳しい扱い方については、検索サイトで
『Android Java JNI』などのキーワードで検索して調べてみてください。
戻る