hello_xr (Openxr) 示例如何检索 Oculus Quest 的 Vulkan API 指针?
How do hello_xr (Openxr) sample retrieve the Vulkan API pointer for the Oculus Quest?
我一直认为在 android 平台上我们应该使用 dlopen()
和 dlsym()
加载指向 Vulkan 库的指针(类似于:
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”动态加载器(就像在 Vulkan Android 示例中 google https://github.com/googlesamples/android-vulkan-tutorials)
由于博客
Gayan Ediriweera (https://gayanediriweera.github.io/code/2021/04/06/how-to-run-helloxr-on-oculus-quest.html)
但是,当我查看 vulkan 的 hello_xr 示例代码时,我没有看到对 dlopen() 或 dlsym() 的调用。例如在第 1287 行(https://github.com/KhronosGroup/OpenXR-SDK-Source/blob/master/src/tests/hello_xr/graphicsplugin_vulkan.cpp),样本调用 vkEnumerateInstanceLayerProperties
但我看不到这个基函数的指针加载到哪里,这让我很困惑。
这里到底发生了什么黑魔法?
OpenXR 运行 是在后台加载这些还是我在代码中遗漏了什么?
在此先感谢您对此的任何帮助
当你想调用某个库中的函数时,有两种方法:
- 告诉编译器你想使用这个库。那么,就用这个函数吧。
- 不要 告诉编译器你想使用这个库。相反,调用
dlopen
加载库,然后调用 dlsym
查找库中的函数,并调用它们。
第一种方式是使用库的正常方式。第二种方法是你只有在有充分理由的情况下才会做的事情——例如,如果你不确定库是否已安装。
我猜 Android 有充分的理由使用 dlopen
(也许旧版本的 Android 没有安装 Vulkan?)而 OpenXR 没有。
我一直认为在 android 平台上我们应该使用 dlopen()
和 dlsym()
加载指向 Vulkan 库的指针(类似于:
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”动态加载器(就像在 Vulkan Android 示例中 google https://github.com/googlesamples/android-vulkan-tutorials)
由于博客 Gayan Ediriweera (https://gayanediriweera.github.io/code/2021/04/06/how-to-run-helloxr-on-oculus-quest.html)
但是,当我查看 vulkan 的 hello_xr 示例代码时,我没有看到对 dlopen() 或 dlsym() 的调用。例如在第 1287 行(https://github.com/KhronosGroup/OpenXR-SDK-Source/blob/master/src/tests/hello_xr/graphicsplugin_vulkan.cpp),样本调用 vkEnumerateInstanceLayerProperties
但我看不到这个基函数的指针加载到哪里,这让我很困惑。
这里到底发生了什么黑魔法? OpenXR 运行 是在后台加载这些还是我在代码中遗漏了什么?
在此先感谢您对此的任何帮助
当你想调用某个库中的函数时,有两种方法:
- 告诉编译器你想使用这个库。那么,就用这个函数吧。
- 不要 告诉编译器你想使用这个库。相反,调用
dlopen
加载库,然后调用dlsym
查找库中的函数,并调用它们。
第一种方式是使用库的正常方式。第二种方法是你只有在有充分理由的情况下才会做的事情——例如,如果你不确定库是否已安装。
我猜 Android 有充分的理由使用 dlopen
(也许旧版本的 Android 没有安装 Vulkan?)而 OpenXR 没有。