// Copyright 2020, Collabora, Ltd. // SPDX-License-Identifier: BSL-1.0 /*! * @file * @brief Functions for Android-specific global state. * @author Rylie Pavlik * @ingroup aux_android */ #include "android_globals.h" #include #include /*! * @todo Do we need locking here? */ static struct { struct _JavaVM *vm = nullptr; jni::Object activity = {}; jni::Object context = {}; struct _ANativeWindow *window = nullptr; } android_globals; void android_globals_store_vm_and_activity(struct _JavaVM *vm, void *activity) { jni::init(vm); android_globals.vm = vm; android_globals.activity = jni::Object((jobject)activity); } void android_globals_store_vm_and_context(struct _JavaVM *vm, void *context) { jni::init(vm); android_globals.vm = vm; android_globals.context = jni::Object((jobject)context); if (android_globals_is_instance_of_activity(vm, context)) { android_globals.activity = jni::Object((jobject)context); } } bool android_globals_is_instance_of_activity(struct _JavaVM *vm, void *obj) { jni::init(vm); auto activity_cls = jni::Class(wrap::android::app::Activity::getTypeName()); return JNI_TRUE == jni::env()->IsInstanceOf((jobject)obj, activity_cls.getHandle()); } void android_globals_store_window(struct _ANativeWindow *window) { android_globals.window = window; } struct _ANativeWindow * android_globals_get_window() { return android_globals.window; } struct _JavaVM * android_globals_get_vm() { return android_globals.vm; } void * android_globals_get_activity() { return android_globals.activity.getHandle(); } void * android_globals_get_context() { return android_globals.context.isNull() ? android_globals.activity.getHandle() : android_globals.context.getHandle(); }