微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

hello_xr (Openxr) 示例如何检索 Oculus Quest 的 Vulkan API 指针?

如何解决hello_xr (Openxr) 示例如何检索 Oculus Quest 的 Vulkan API 指针?

我一直认为在 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”动态加载器(如谷歌 https://github.com/googlesamples/android-vulkan-tutorials 的 Vulkan Android 示例)

感谢 oculus quest 的博客,我能够构建和运行 hello_xr 示例 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 运行时是否会在后台加载这些内容,还是我在代码中遗漏了什么?

预先感谢您对此的任何帮助

解决方法

当你想从某个库中调用一个函数时,有两种方法:

  1. 告诉编译器您要使用该库。然后,只需使用该功能。
  2. 不要告诉编译器你想使用这个库。相反,调用 dlopen 加载库,然后调用 dlsym 查找库中的函数,并调用它们。

第一种方式是使用库的正常方式。第二种方法是您只有在有充分理由的情况下才能执行的操作 - 例如,如果您不确定该库是否已安装。

我猜 Android 有充分的理由使用 dlopen(也许旧版本的 Android 没有安装 Vulkan?)而 OpenXR 没有。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。