void* SDL_AndroidGetJNIEnv()
#include "SDL.h"
#include <jni.h>
// このサンプルはC++と "void showHome()" という名前のJavaカスタムメソッドが必要である
// Javaのアクティビティのインスタンスの void showHome() メソッドを呼ぶ
void showHome(void)
{
// JNI環境を得る
JNIEnv* env = (JNIEnv*)SDL_AndroidGetJNIEnv();
// SDLActivityのJavaインスタンスを得る
jobject activity = (jobject)SDL_AndroidGetActivity();
// アクティビティの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()から戻って(アプリケー
// ションが終了して)始めて参照が削除されるからである.
}
これはネイティブコードからJava仮想マシンにアクセスするのに必要なJNIEnvであり, Cから多くのAndroid APIを使うために必要なものである.
この関数はJNIEnv型を戻すが, 戻り値の関数プロトタイプはvoid*で定義されている. SDLのヘッダにはjni.hがインクルードされていないためである.