Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
godotengine
GitHub Repository: godotengine/godot
Path: blob/master/thirdparty/openxr/src/loader/loader_init_data.cpp
9917 views
1
// Copyright (c) 2017-2025 The Khronos Group Inc.
2
// Copyright (c) 2017-2019 Valve Corporation
3
// Copyright (c) 2017-2019 LunarG, Inc.
4
//
5
// SPDX-License-Identifier: Apache-2.0 OR MIT
6
//
7
// Initial Author: Mark Young <[email protected]>
8
//
9
10
#include "loader_init_data.hpp"
11
12
#ifdef XR_KHR_LOADER_INIT_SUPPORT
13
14
// Check and copy the Android-specific init data.
15
XrResult LoaderInitData::initialize(const XrLoaderInitInfoBaseHeaderKHR* info) {
16
#if defined(XR_USE_PLATFORM_ANDROID)
17
if (info->type != XR_TYPE_LOADER_INIT_INFO_ANDROID_KHR) {
18
return XR_ERROR_VALIDATION_FAILURE;
19
}
20
auto cast_info = reinterpret_cast<XrLoaderInitInfoAndroidKHR const*>(info);
21
22
if (cast_info->applicationVM == nullptr) {
23
return XR_ERROR_VALIDATION_FAILURE;
24
}
25
if (cast_info->applicationContext == nullptr) {
26
return XR_ERROR_VALIDATION_FAILURE;
27
}
28
29
// Copy and store the JVM pointer and Android Context, ensuring the JVM is initialised.
30
_data = *cast_info;
31
_data.next = nullptr;
32
jni::init(static_cast<jni::JavaVM*>(_data.applicationVM));
33
const jni::Object context = jni::Object{static_cast<jni::jobject>(_data.applicationContext)};
34
35
// Retrieve a reference to the Android AssetManager.
36
const auto assetManager = context.call<jni::Object>("getAssets()Landroid/content/res/AssetManager;");
37
_android_asset_manager = AAssetManager_fromJava(jni::env(), assetManager.getHandle());
38
39
// Retrieve the path to the native libraries.
40
const auto applicationContext = context.call<jni::Object>("getApplicationContext()Landroid/content/Context;");
41
const auto applicationInfo = context.call<jni::Object>("getApplicationInfo()Landroid/content/pm/ApplicationInfo;");
42
_native_library_path = applicationInfo.get<std::string>("nativeLibraryDir");
43
#else
44
#error "Platform specific XR_KHR_loader_init structure is not defined for this platform."
45
#endif // XR_USE_PLATFORM_ANDROID
46
47
_initialized = true;
48
return XR_SUCCESS;
49
}
50
51
XrResult InitializeLoaderInitData(const XrLoaderInitInfoBaseHeaderKHR* loaderInitInfo) {
52
return LoaderInitData::instance().initialize(loaderInitInfo);
53
}
54
55
#ifdef XR_USE_PLATFORM_ANDROID
56
std::string GetAndroidNativeLibraryDir() { return LoaderInitData::instance()._native_library_path; }
57
58
void* Android_Get_Asset_Manager() { return LoaderInitData::instance()._android_asset_manager; }
59
#endif // XR_USE_PLATFORM_ANDROID
60
61
#endif // XR_KHR_LOADER_INIT_SUPPORT
62
63