如何使JNI应用程序在Linux上支持多个版本的JVM?

时间:2013-08-13 21:35:22

标签: java linux jvm java-native-interface shared-libraries

我有一个使用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一起使用?

3 个答案:

答案 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可执行文件的位置。