我正在构建一个 Java 应用程序,该应用程序使用用 C++ 编写并针对不同操作系统进行编译的共享库。问题是,这个共享库本身依赖于它通常在适当的环境变量下找到的附加库(PATH
, LIBRARY_PATH
or LD_LIBRARY_PATH
).
我可以 - 但不想 - 设置这些环境变量。我宁愿在运行时从给定路径加载所需的共享库 - 就像插件一样。不 - 我不希望任何启动应用程序在新环境中启动新进程。有人知道如何实现这一目标吗?
我知道这一定是可能的,因为我使用的库之一能够从给定路径加载其插件。当然,我更喜欢独立于平台的代码,但如果这不可能,针对 Windows、Linux 和 MacOS 的单独解决方案也可以做到。
EDIT我应该提到我希望使用的共享库是面向对象的,这意味着单个函数的绑定无法做到这一点。
在 UNIX/Linux 系统上您可以使用dlopen
。那么问题是你必须通过以下方式获取你需要的所有符号dlsym
简单的例子:
typedef int (*some_func)(char *param);
void *myso = dlopen("/path/to/my.so", RTLD_NOW);
some_func *func = dlsym(myso, "function_name_to_fetch");
func("foo");
dlclose(myso);
将加载 .so 并从那里执行 function_name_to_fetch() 。有关更多信息,请参阅手册页 dlopen(1)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)