【问题标题】:How can I make lazy/delay loading work in Linux?如何使延迟/延迟加载在 Linux 中工作?
【发布时间】:2012-03-01 23:00:49
【问题描述】:

我在 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 的),那么目录可能会有所不同 (?)。

【问题讨论】:

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


【解决方案1】:

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

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

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

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

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

我想作为要求您的用户安装 JRE(如果找不到 JRE)的一部分,您可以要求他们设置 $JAVA_HOME 作为相当标准的做法。

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

【讨论】:

  • 在 Win 上我可以检查注册表和一些众所周知的位置 - 不完美,但足够好。这些是 如何 找到 JRE 的一些很好的建议,但我遇到的问题是我什至没有机会进行搜索,因为加载程序需要 libjvm.so 等。在插件加载时可见。
【解决方案2】:

如果您的程序只是运行java /path/to/foo.jar,那么在 Debian 派生系统上解决方案很简单:

$ ls -l /usr/bin/java /etc/alternatives/java /usr/lib/jvm/java-6-sun/jre/bin/java | awk '{print $1, $8, $9, $10}'
lrwxrwxrwx /etc/alternatives/java -> /usr/lib/jvm/java-6-sun/jre/bin/java
lrwxrwxrwx /usr/bin/java -> /etc/alternatives/java
-rwxr-xr-x /usr/lib/jvm/java-6-sun/jre/bin/java  
$ 

/usr/bin/java 中的java 是指向真实 JRE 的符号链接的符号链接。

【讨论】:

  • C++ 插件与 libjvm.so 动态链接。我正在使用 JNI 调用接口从 C++ 线程创建 JVM。因此,找到 java 可执行文件并不是真正的问题,尽管它可以很好地提示 JRE 的安装位置。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多