我一直认为,在安卓平台上,我们应该使用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“动态加载器(类似于google https://github.com/googlesamples/android-vulkan-tutorials的Vulkan Android示例)
由于Gayan (https://gayanediriweera.github.io/code/2021/04/06/how-to-run-helloxr-on-oculus-quest.html)的博客,我能够在oculus任务上构建并运行hello_xr示例。
然而,当我查看vulkan的hello_xr示例的代码时,我还没有看到对dlopen()或dlsym()的调用。例如,在第1287行(https://github.com/KhronosGroup/OpenXR-SDK-Source/blob/master/src/tests/hello_xr/graphicsplugin_vulkan.cpp),示例调用vkEnumerateInstanceLayerProperties,但我不知道这个基本函数的指针是在哪里加载的,这让我很困惑。
这里到底发生了什么黑魔法?OpenXR运行时是在幕后加载这些内容,还是代码中遗漏了什么?
谢谢您在这方面的任何帮助。
发布于 2021-07-30 12:24:33
当您想从某个库调用函数时,有两种方法:
dlopen加载库,然后调用dlsym查找库中的函数,并调用它们。第一种方法是使用库的正常方式。第二种方法是只有有一个很好的理由才能做的事情--例如,如果您不确定库是否安装了。
我猜安卓有很好的理由使用dlopen (也许旧版本的Android没有安装Vulkan?)而OpenXR没有。
https://stackoverflow.com/questions/68589407
复制相似问题