0

我有一个使用 Java 6 在 Linux 机器上编译的 JNI 应用程序。当我尝试在安装了 Java 7 的机器上运行它时,出现以下错误:

./test:加载共享库时出错:libjvm.so:无法打开共享对象文件:没有这样的文件或目录

问题是 libjvm.so 位于/usr/lib/jvm/java-7-openjdk-amd64/jre/lib/amd64/server第二台机器上,而该目录不在RPATH

$ objdump -x test | grep RPATH
  RPATH                /usr/lib/jvm/java-6-openjdk/jre/lib/amd64:/usr/lib/jvm/ja
  va-6-openjdk/jre/lib/amd64/server

一个明显的解决方案是添加/usr/lib/jvm/java-7-openjdk-amd64/jre/lib/amd64/serverRPATH,但我想知道是否有更通用的方法来解决这个问题并使应用程序与系统上安装的任何 JVM 一起工作?

4

3 回答 3

1

您可以指定库路径:

java -Djava.library.path="path_here"

编辑:请注意,它需要一个文件夹来查看,而不是一个特定的文件。:)

Edit2:路径可以是相对的。

于 2013-08-13T21:37:37.823 回答
0

在 Windows 上,您可以使用注册表项。但是你的问题是关于 Linux 的,你的选择是有限的。您总是可以使用肮脏的技巧,例如在java上查找可执行文件$PATH,但最干净的方法是$JAVA_HOME. 它不像 Windows 注册表项那样万无一失,因为用户仍然必须手动创建它。但$JAVA_HOME已经基本成为寻找JVM的标准解决方案。许多其他软件产品都依赖它,所以很有可能,您的用户可能已经拥有它。

于 2013-08-14T10:18:18.577 回答
0

我发现该解决方案适用于所有基于 Debian 的发行版,包括 Debian 本身、Ubuntu、Mint 等:使用/usr/lib/jvm/default-java/...而不是/usr/lib/jvm/java-6-openjdk/...in RPATH。同样,也可以添加Centos/RHEL支持。/usr/lib/jvm/java/...

并且作为备用解决方案,或者可以使用JAVA_HOME查找可执行文件的位置。java

于 2013-08-14T16:00:19.423 回答