diff --git a/panda/src/android/config_android.cxx b/panda/src/android/config_android.cxx index 083cd7c192..760cf8f51c 100644 --- a/panda/src/android/config_android.cxx +++ b/panda/src/android/config_android.cxx @@ -28,6 +28,9 @@ jmethodID jni_PandaActivity_createBitmap; jmethodID jni_PandaActivity_compressBitmap; jmethodID jni_PandaActivity_showToast; +jclass jni_Activity; +jmethodID jni_Activity_setTitle; + jclass jni_BitmapFactory_Options; jfieldID jni_BitmapFactory_Options_outWidth; jfieldID jni_BitmapFactory_Options_outHeight; @@ -80,6 +83,11 @@ jint JNI_OnLoad(JavaVM *jvm, void *reserved) { jni_PandaActivity_showToast = env->GetMethodID(jni_PandaActivity, "showToast", "(Ljava/lang/String;I)V"); + jni_Activity = env->FindClass("android/app/Activity"); + jni_Activity = (jclass) env->NewGlobalRef(jni_Activity); + jni_Activity_setTitle = env->GetMethodID(jni_Activity, + "setTitle", "(Ljava/lang/CharSequence;)V"); + jni_BitmapFactory_Options = env->FindClass("android/graphics/BitmapFactory$Options"); jni_BitmapFactory_Options = (jclass) env->NewGlobalRef(jni_BitmapFactory_Options); @@ -118,6 +126,7 @@ void JNI_OnUnload(JavaVM *jvm, void *reserved) { nassertv(env != nullptr); env->DeleteGlobalRef(jni_PandaActivity); + env->DeleteGlobalRef(jni_Activity); env->DeleteGlobalRef(jni_BitmapFactory_Options); // These will no longer work without JNI, so unregister them. @@ -135,6 +144,21 @@ void JNI_OnUnload(JavaVM *jvm, void *reserved) { } } +/** + * Sets the window title of the activity. + */ +void android_set_title(ANativeActivity *activity, const std::string &title) { + nassertv(jni_Activity_setTitle); + + Thread *thread = Thread::get_current_thread(); + JNIEnv *env = thread->get_jni_env(); + nassertv(env != nullptr); + + jstring jmsg = env->NewStringUTF(title.c_str()); + env->CallVoidMethod(activity->clazz, jni_Activity_setTitle, jmsg); + env->DeleteLocalRef(jmsg); +} + /** * Shows a toast notification at the bottom of the activity. The duration * should be 0 for short and 1 for long. diff --git a/panda/src/android/config_android.h b/panda/src/android/config_android.h index 4935db0718..71d42af3f3 100644 --- a/panda/src/android/config_android.h +++ b/panda/src/android/config_android.h @@ -35,10 +35,14 @@ extern jmethodID jni_PandaActivity_createBitmap; extern jmethodID jni_PandaActivity_compressBitmap; extern jmethodID jni_PandaActivity_showToast; +extern jclass jni_Activity; +extern jmethodID jni_Activity_setTitle; + extern jclass jni_BitmapFactory_Options; extern jfieldID jni_BitmapFactory_Options_outWidth; extern jfieldID jni_BitmapFactory_Options_outHeight; +EXPORT_CLASS void android_set_title(ANativeActivity *activity, const std::string &title); EXPORT_CLASS void android_show_toast(ANativeActivity *activity, const std::string &message, int duration); #endif diff --git a/panda/src/androiddisplay/androidGraphicsWindow.cxx b/panda/src/androiddisplay/androidGraphicsWindow.cxx index 1cc59d8298..e88d6dae6a 100644 --- a/panda/src/androiddisplay/androidGraphicsWindow.cxx +++ b/panda/src/androiddisplay/androidGraphicsWindow.cxx @@ -15,6 +15,7 @@ #include "androidGraphicsStateGuardian.h" #include "config_androiddisplay.h" #include "androidGraphicsPipe.h" +#include "config_android.h" #include "graphicsPipe.h" #include "keyboardButton.h" @@ -232,6 +233,11 @@ set_properties_now(WindowProperties &properties) { _properties.set_fullscreen(properties.get_fullscreen()); properties.clear_fullscreen(); } + + if (properties.has_title()) { + android_set_title(_app->activity, properties.get_title()); + properties.clear_title(); + } } /**