繁体   English   中英

如何在Linux中使延迟/延迟加载工作?

[英]How can I make lazy/delay loading work in Linux?

我在Windows上运行良好-应用程序加载了我的插件(C ++,Qt),我的插件进行了智能搜索以找到已安装的JRE,相应地设置了库搜索路径,然后在JVM中调用一个函数来强制jvm .dll将在此时加载。 (先前的问题: 如何部署混合的C ++ / Java(JNI)应用程序?

现在,我正在尝试使其在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的JDK),则目录可能会有所不同(?)。

您如何在Windows上进行智能搜索? 在Linux中有几个“普通”的地方。

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

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

通常,如果安装了JRE,则它可能位于/ usr / lib / jvm *,/ usr / java *,/ usr / lib / java *之一,也可能位于上述lib64之一。

当然,上述方法将最有可能点你到一个 JRE。 确定使用哪个可能很棘手,但是如果您的代码不依赖最新和最高级的代码,那可能就可以了。

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

我不知道它能在所有发行版上正常工作的确切方法,因为部分问题源于* nix发行版的性质。 但是,我可能还缺少其他约定。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM