#include "jetson_runtime_loader.h"
#include <dlfcn.h>
#include <string>
namespace {
void* TryLoad(const std::string& name) {
return dlopen(name.c_str(), RTLD_LAZY | RTLD_GLOBAL);
}
void* LoadWithFallbacks(const char* lib_name) {
static const char* const kNvidiaLibDirs[] = {
"/usr/lib/aarch64-linux-gnu/nvidia/",
"/usr/lib/aarch64-linux-gnu/tegra/",
};
const std::string name(lib_name);
if (void* handle = TryLoad(name)) {
return handle;
}
for (const char* dir : kNvidiaLibDirs) {
if (void* handle = TryLoad(dir + name)) {
return handle;
}
}
const size_t so_pos = name.rfind(".so.");
if (so_pos != std::string::npos) {
const std::string unversioned = name.substr(0, so_pos + 3);
if (void* handle = TryLoad(unversioned)) {
return handle;
}
for (const char* dir : kNvidiaLibDirs) {
if (void* handle = TryLoad(dir + unversioned)) {
return handle;
}
}
}
return nullptr;
}
}
extern "C" void* lk_jetson_dlopen(const char* lib_name) {
return LoadWithFallbacks(lib_name);
}
extern "C" int lk_jetson_runtime_libs_available(void) {
static const bool available =
LoadWithFallbacks("libnvbufsurface.so.1.0.0") != nullptr &&
LoadWithFallbacks("libv4l2.so.0") != nullptr;
return available ? 1 : 0;
}