The open source OpenXR runtime
1// Copyright 2020, Collabora, Ltd.
2// SPDX-License-Identifier: BSL-1.0
3/*!
4 * @file
5 * @brief Functions for Android-specific global state.
6 * @author Rylie Pavlik <rylie.pavlik@collabora.com>
7 * @ingroup aux_android
8 */
9
10#include "android_globals.h"
11
12#include <stddef.h>
13#include <wrap/android.app.h>
14
15/*!
16 * @todo Do we need locking here?
17 */
18static struct
19{
20 struct _JavaVM *vm = nullptr;
21 jni::Object activity = {};
22 jni::Object context = {};
23 struct _ANativeWindow *window = nullptr;
24} android_globals;
25
26void
27android_globals_store_vm_and_activity(struct _JavaVM *vm, void *activity)
28{
29 jni::init(vm);
30 android_globals.vm = vm;
31 android_globals.activity = jni::Object((jobject)activity);
32}
33
34void
35android_globals_store_vm_and_context(struct _JavaVM *vm, void *context)
36{
37 jni::init(vm);
38 android_globals.vm = vm;
39 android_globals.context = jni::Object((jobject)context);
40 if (android_globals_is_instance_of_activity(vm, context)) {
41 android_globals.activity = jni::Object((jobject)context);
42 }
43}
44
45bool
46android_globals_is_instance_of_activity(struct _JavaVM *vm, void *obj)
47{
48 jni::init(vm);
49
50 auto activity_cls = jni::Class(wrap::android::app::Activity::getTypeName());
51 return JNI_TRUE == jni::env()->IsInstanceOf((jobject)obj, activity_cls.getHandle());
52}
53
54void
55android_globals_store_window(struct _ANativeWindow *window)
56{
57 android_globals.window = window;
58}
59
60struct _ANativeWindow *
61android_globals_get_window()
62{
63 return android_globals.window;
64}
65
66struct _JavaVM *
67android_globals_get_vm()
68{
69 return android_globals.vm;
70}
71
72void *
73android_globals_get_activity()
74{
75 return android_globals.activity.getHandle();
76}
77
78void *
79android_globals_get_context()
80{
81 return android_globals.context.isNull() ? android_globals.activity.getHandle()
82 : android_globals.context.getHandle();
83}