【发布时间】:2021-07-30 10:25:59
【问题描述】:
我一直认为在 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 运行时是在后台加载这些还是我在代码中遗漏了什么?
提前感谢您对此的任何帮助
【问题讨论】:
-
你知道 dlopen 是做什么的吗?你知道为什么你不需要需要使用 dlopen 来调用 printf 吗?
-
@user253751 不就是动态加载共享库吗?第二个问题的答案与这个问题的答案有关吗? stackoverflow.com/questions/63306734/…
标签: android c++ vulkan oculus openxr