我有一个使用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/server
添加到RPATH
,但我想知道是否有更通用的方法来解决此问题并使应用程序与系统上安装的任何JVM一起使用?
答案 0 :(得分:1)
您可以指定库路径:
java -Djava.library.path="path_here"
编辑:请注意,它需要查找文件夹,而不是特定文件。 :)
Edit2:路径可以是相对的。
答案 1 :(得分:0)
在Windows上,您可以使用注册表项。但你的问题是关于Linux,你的选择是有限的。您可以随时使用脏问题,例如在java
上查找$PATH
可执行文件,但最干净的方式是$JAVA_HOME
。它不像Windows注册表项那样万无一失,因为用户仍然需要手动创建它。但$JAVA_HOME
基本上已成为查找JVM的标准解决方案。许多其他软件产品都依赖它,所以很可能,您的用户可能已经拥有它。
答案 2 :(得分:0)
我发现该解决方案适用于所有基于Debian的发行版,包括Debian本身,Ubuntu,Mint等:在/usr/lib/jvm/default-java/...
中使用/usr/lib/jvm/java-6-openjdk/...
而不是RPATH
。同样,Centos/RHEL
支持也可以添加/usr/lib/jvm/java/...
。
作为后备解决方案,可以使用JAVA_HOME
或查找java
可执行文件的位置。