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

时间:2012-03-01 23:00:50

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

2 个答案:

答案 0 :(得分:1)

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

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

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

一般情况下,如果安装了JRE,它可能位于/ usr / lib / jvm *,/ usr / java *,/ usr / lib / java *中,或者可能是其中一个lib64变种。上方。

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

我认为,如果找不到一个JRE,请求用户安装JRE,你可以要求他们将$ JAVA_HOME设置为相当标准的做法。

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

答案 1 :(得分:0)

如果您的程序只运行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  
$ 

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

相关问题