我在 Windows 上运行良好——应用程序加载我的插件(C++、Qt),我的插件进行智能搜索以查找已安装的 JRE,相应地设置库搜索路径,然后调用 JVM 中的函数强制在此时加载 jvm.dll。 (上一题:How can I deploy a mixed C++/Java (JNI) application?)
现在我正试图让它在 Linux 上运行。根据我的阅读,惰性链接/加载是默认设置,所以我认为它会正常工作......看起来不像。
我想避免使用 dlopen()
和 dlsym()
、LD_LIBRARY_PATH
、ldconfig
等. 这个想法是这个插件的用户不必知道它是如何工作的,他们只是把 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/