#include "DxLib.h"
int android_main( void )
{
JNIEnv *env ;
const ANativeActivity *NativeActivity ;
int HeadSetState = 0 ;
int SoundHandle ;
// 背景を灰色にする
SetBackgroundColor( 128,128,128 ) ;
// DXライブラリの初期化
if( DxLib_Init() < 0 ) return -1 ;
// 描画先を裏画面に変更
SetDrawScreen( DX_SCREEN_BACK ) ;
// アプリの NativeActivity を取得しておく
NativeActivity = GetNativeActivity() ;
// Java の関数 SetupHeadsetEventReceiver の呼び出し
{
// JavaVM とソフト実行用スレッドを関連付け( C++ から Java の機能を使用するために必要 )
if( NativeActivity->vm->AttachCurrentThreadAsDaemon( &env, NULL ) != JNI_OK )
{
return -1 ;
}
// Java のクラス MainActivity を取得
jclass jclass_MainActivity = env->GetObjectClass( NativeActivity->clazz ) ;
// Java のクラス MainActivity のメンバー関数 SetupHeadsetEventReceiver の ID を取得
jmethodID jmethodID_SetupHeadsetEventReceiver = env->GetMethodID( jclass_MainActivity, "SetupHeadsetEventReceiver", "()V" ) ;
// Java のクラス MainActivity のメンバー関数 SetupHeadsetEventReceiver の呼び出し
env->CallVoidMethod( NativeActivity->clazz, jmethodID_SetupHeadsetEventReceiver ) ;
// Java のクラス MainActivity の参照を削除
env->DeleteLocalRef( jclass_MainActivity ) ;
// JavaVM とソフト実行用スレッドの関連付け終了
NativeActivity->vm->DetachCurrentThread() ;
}
// メインループ
while( ProcessMessage() == 0 )
{
// 裏画面の内容をクリア
ClearDrawScreen() ;
// JavaVM とソフト実行用スレッドを関連付け
if( NativeActivity->vm->AttachCurrentThreadAsDaemon( &env, NULL ) == JNI_OK )
{
// Java のクラス MainActivity を取得
jclass jclass_MainActivity = env->GetObjectClass( NativeActivity->clazz ) ;
// Java のクラス MainActivity のメンバー変数 HeadSetState の ID を取得
jfieldID jfieldID_HeadSetState = env->GetFieldID( jclass_MainActivity, "HeadSetState", "I" ) ;
// Java のクラス MainActivity のメンバー変数 HeadSetState の値を取得
HeadSetState = env->GetIntField( NativeActivity->clazz, jfieldID_HeadSetState ) ;
// Java のクラス MainActivity の参照を削除
env->DeleteLocalRef( jclass_MainActivity ) ;
// JavaVM とこのスレッドの関連付け終了
NativeActivity->vm->DetachCurrentThread() ;
}
// ヘッドセットの接続状態を描画
DrawFormatString( 0, 0, GetColor( 255,255,255 ), "HeadSetState:%d", HeadSetState ) ;
// 裏画面の内容を表画面に反映
ScreenFlip() ;
}
// DXライブラリの後始末
DxLib_End();
// ソフトの終了
return 0;
}
以上です。
これでプロジェクトを実行すると、画面に『イヤホンやヘッドフォンが端末に接続されているかどうか』の情報が表示されます。( 0:接続されていない 1:接続されている )
詳細は割愛しますが、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』などのキーワードで検索して調べてみてください。
戻る