目次 - SDL 3.0 API(機能別) - 環境固有の機能 - SDL_GetAndroidActivity

SDL_GetAndroidActivity

AndroidアクティビティクラスのJavaインスタンスを得る

ヘッダ

SDL3/SDL_system.h

構文

void * SDL_GetAndroidActivity(void);

戻り値

(void *) jobject型のAndroidアプリケーションのアクティビティクラスのインスタンスを戻す. 失敗のときNULLを戻す. SDL_GetError()を呼んで詳細を知ることができる.

詳細

この関数はjobject型を戻すが, 戻り値の関数プロトタイプはvoid*で定義されている. SDLのヘッダにはjni.hがインクルードされていないためである.

この関数が戻したjobjectはローカル参照で, 呼び出し側が解放する必要がある. JavaネイティブインターフェースのPushLocalFrame(), PopLocalFrame(), DeleteLocalRef()関数を参照すること.

https://docs.oracle.com/javase/1.5.0/docs/guide/jni/spec/functions.html

スレッドセーフ

この関数はどのスレッドからも安全に呼べる.

バージョン

SDL 3.2.0以降

サンプルコード

#include <SDL3/SDL.h>
#include <jni.h>

// このサンプルはC++と "void showHome()" という名前のJavaカスタムメソッドが必要である

// Javaのアクティビティのインスタンスの void MyActivity.showHome() メソッドを呼ぶ
void showHome(void)
{
    // JNI環境を得る
    JNIEnv* env = (JNIEnv*)SDL_GetAndroidJNIEnv();

    // SDLActivityのJavaインスタンスを得る
    jobject activity = (jobject)SDL_GetAndroidActivity();

    // アクティビティのJavaクラスを検索する. SDLActivityかそのサブクラスである必要がある
    jclass clazz(env->GetObjectClass(activity));

    // メソッドのIDを得る
    jmethodID method_id = env->GetMethodID(clazz, "showHome", "()V");

    // Javaメソッドを実際に呼ぶ
    env->CallVoidMethod(activity, method_id);

    // ローカル参照を解放する
    env->DeleteLocalRef(activity);
    env->DeleteLocalRef(clazz);

    // 注意(とAndroid用SDLの実装の詳細に関する記述):
    // もしJava側が呼んだネイティブ関数から戻ると, ローカル参照は自動的に削除
    // される. SDLではmain()それ自身がネイティブ関数である. したがって, 参照
    // は手動で削除しなければならない. そうしないとmain()から戻って(アプリケー
    // ションが終了して)始めて参照が削除されるからである.
}

SDL Wikiへのリンク

SDL_GetAndroidActivity - SDL Wiki