Как образец hello_xr (Openxr) получает указатель API Vulkan для Oculus Quest?
Я всегда думал, что на платформе Android мы должны были загрузить указатель на библиотеку Vulkan, используя
dlopen()
и
dlsym()
(что-то подобное:
libVulkan = dlopen("libvulkan.so", RTLD_NOW | RTLD_LOCAL);
vkEnumerateInstanceExtensionProperties = reinterpret_cast<PFN_vkEnumerateInstanceExtensionProperties(dlsym(libVulkan,"vkEnumerateInstanceExtensionProperties"));
(источник: https://github.com/SaschaWillems/Vulkan/blob/master/base/VulkanAndroid.cpp)
)
или с помощью динамического загрузчика vulkan_wrapper.h (например, в примерах Android Vulkan от Google https://github.com/googlesamples/android-vulkan-tutorials)
Мне удалось собрать и запустить образец hello_xr в квесте oculus благодаря блогу Гаян Эдиривира (https://gayanediriweera.github.io/code/2021/04/06/how-to-run-helloxr-on-oculus-quest.html)
Однако когда я смотрю код примера hello_xr для vulkan, я не видел вызова dlopen () или dlsym(). Например, в строке 1287 (https://github.com/KhronosGroup/OpenXR-SDK-Source/blob/master/src/tests/hello_xr/graphicsplugin_vulkan.cpp) пример вызова
vkEnumerateInstanceLayerProperties
но я не вижу, где загружен указатель на эту базовую функцию, что меня смущает.
Что за черная магия здесь творится? Загружает ли их среда выполнения OpenXR под капотом, или мне что-то не хватает в коде?
Заранее благодарим за любую помощь по этому поводу
1 ответ
Если вы хотите вызвать функцию из какой-либо библиотеки, есть два способа сделать это:
- Сообщите компилятору, что вы хотите использовать библиотеку. Затем просто используйте функцию.
- Не говорите компилятору, что хотите использовать библиотеку. Вместо этого вызовите для загрузки библиотеки, а затем вызовите
dlsym
чтобы найти функции в библиотеке и вызвать их.
Первый способ - это обычный способ использования библиотеки. Второй способ - это то, что вы делаете только по уважительной причине - например, если вы не уверены, что библиотека установлена.
Я бы предположил, что у Android есть веские причины использовать
dlopen
(возможно, в старых версиях Android не установлен Vulkan?), а в OpenXR нет.