【发布时间】: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_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 的),那么目录可能会有所不同 (?)。
【问题讨论】:
-
Sun JRE 在我的 Ubuntu 系统上获得
/usr/lib/jvm/java-6-sun-1.6.0.26/jre/lib/...。 -
我认为这个问题:stackoverflow.com/questions/2009183/… 与我的问题基本相同
-
.. 我认为使用
dlopen()是我最好的选择,使用这里描述的技巧:stackoverflow.com/a/1067684
标签: java c++ linux shared-libraries lazy-loading