我在 Windows 上运行得很好——应用程序加载我的插件(C++、Qt),我的插件进行智能搜索以查找已安装的 JRE,相应地设置库搜索路径,然后调用 JVM 中的一个函数来强制 jvm .dll 将在此时加载。 (上一个问题:如何部署混合 C++/Java (JNI) 应用程序? https://stackoverflow.com/questions/9120694/how-can-i-deploy-a-mixed-c-java-jni-application)
现在我正在尝试让它在 Linux 上运行。从我读到的内容来看,延迟链接/加载是默认的,所以我认为它会起作用......似乎并非如此。
我想避免dlopen()
and dlsym()
, LD_LIBRARY_PATH
, ldconfig
这个想法是,这个插件的用户不必知道其中任何一个是如何工作的,他们只需将plugin.so放在正确的位置,当它加载时,插件可以智能地找到JRE(或告诉用户安装 JRE)。
这可以做到吗?
EDIT
只是为了清楚...加载插件时出现的错误:“无法加载库 /home/dan/blah/blah/libMyPlugin.so: (libjawt.so: 无法打开共享对象文件: 没有这样的文件或目录)”
EDIT
如果重要的话...这需要在 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。
我无法访问您列出的所有系统,但在某些发行版上,您有一个符号链接 /usr/java/latest 它将指向最新安装的版本。
一般来说,如果安装了 JRE,它可能位于 /usr/lib/jvm*、/usr/java*、/usr/lib/java* 之一,或者可能位于上述 lib64 变体之一。
当然,以上方法很可能会告诉你aJRE。决定使用哪个可能很棘手,但如果您的代码不依赖于最新和最好的,那么可能没问题。
我想,作为要求用户安装 JRE(如果找不到 JRE)的一部分,您可以要求他们设置 $JAVA_HOME,因为这是相当标准的做法。
我不知道有什么方法可以让它在所有发行版上工作,因为部分问题源于 *nix 发行版的本质。然而,我可能缺少一个额外的约定。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)