java - 如何在 Linux 中进行延迟/延迟加载?

标签 java c++ linux shared-libraries lazy-loading

我在 Windows 上运行良好——应用程序加载我的插件(C++、Qt),我的插件进行智能搜索以查找已安装的 JRE,相应地设置库搜索路径,然后调用 JVM 中的函数强制在此时加载 jvm.dll。 (上一题:How can I deploy a mixed C++/Java (JNI) application?)

现在我正试图让它在 Linux 上运行。根据我的阅读,惰性链接/加载是默认设置,所以我认为它会正常工作......看起来不像。

我想避免使用 dlopen()dlsym()LD_LIBRARY_PATHldconfig 等. 这个想法是这个插件的用户不必知道它是如何工作的,他们只是把 plugin.so 放在正确的地方,当它被加载时,插件会智能地找到 JRE(或告诉用户安装 JRE)。

这可以做到吗?

编辑

需要说明的是……我在加载插件时遇到的错误:“无法加载库/home/dan/blah/blah/libMyPlugin.so: (libjawt.so: 无法打开共享对象文件:没有这样的文件或目录)”

编辑

如果重要的话...这需要在 Ubuntu 10.10 及更高版本、CentOS 5.4 和 OSX 10.6+ 上运行。

在 Ubuntu 10.10 上,我执行了 apt-get install openjdk-6-jdk 然后为了让事情正常运行我必须

export LD_LIBRARY_PATH=
  /usr/lib/jvm/java-6-openjdk/jre/lib/i386:
  /usr/lib/jvm/java-6-openjdk/jre/lib/i386/client:
  /usr/lib/jvm/java-6-openjdk/jre/lib/i386/xawt

(为了易读而换行)

但是如果有人安装了不同的 JDK(例如 Sun 的),那么目录可能会有所不同(?)。

最佳答案

您是如何在 Windows 上进行智能搜索的?在 Linux 中有几个“正常”的地方可以查看。

很多时候 $JAVA_HOME 环境变量被设置为当前的 JRE。

我没有准备好访问您列出的所有系统,但在某些发行版上,您有一个符号链接(symbolic link)/usr/java/latest 它将指向最新安装的版本。

一般来说,如果安装了 JRE,它可能位于/usr/lib/jvm*、/usr/java*、/usr/lib/java* 之一,或者可能是 lib64 变体之一以上。

当然,上述方法很可能会将您指向 JRE。决定使用哪个可能会很棘手,但如果您的代码不依赖于最新和最好的,它可能没问题。

我想作为要求您的用户在找不到 JRE 时安装 JRE 的一部分,您可以要求他们设置 $JAVA_HOME,因为这是相当标准的做法。

我不知道有什么可靠的方法可以让它在所有发行版上运行,因为部分问题源于 *nix 发行版的性质。但是,我可能还缺少一个额外的约定。

关于java - 如何在 Linux 中进行延迟/延迟加载?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9525566/

相关文章:

c++ - JNI - 将类实例发送到 C++

c++ - 如何以最大化状态启动我的 cinder 应用程序?

python - 无法在 Linux 上用 Python 打开具有完整路径名的文件

java - 有没有办法通过Vsphere SDK with Java获取Vmware ESX中每个vmware的驱动信息?

java - 寻找一种重新运行类静态初始化器的方法

c++ - 继承 - 使用指针输出

linux - 无法使用 start-stop-daemon 停止 init 脚本

linux - sed - 删除两个空行之前的文本

java - 避免 JSP 中 JSTL 中的多个 forEach 循环

java - 跨服务锁定文件