Как образец 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 ответ

Решение

Если вы хотите вызвать функцию из какой-либо библиотеки, есть два способа сделать это:

  1. Сообщите компилятору, что вы хотите использовать библиотеку. Затем просто используйте функцию.
  2. Не говорите компилятору, что хотите использовать библиотеку. Вместо этого вызовите для загрузки библиотеки, а затем вызовите dlsym чтобы найти функции в библиотеке и вызвать их.

Первый способ - это обычный способ использования библиотеки. Второй способ - это то, что вы делаете только по уважительной причине - например, если вы не уверены, что библиотека установлена.

Я бы предположил, что у Android есть веские причины использовать dlopen (возможно, в старых версиях Android не установлен Vulkan?), а в OpenXR нет.

Другие вопросы по тегам