【问题标题】:How to make a JNI application support multiple versions of JVM on Linux?如何让一个 JNI 应用在 Linux 上支持多个版本的 JVM?
【发布时间】:2013-08-13 21:35:21
【问题描述】:

我有一个在装有 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 一起工作?

【问题讨论】:

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


    【解决方案1】:

    可以指定库路径:

    java -Djava.library.path="path_here"
    

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

    Edit2:路径可以是相对的。

    【讨论】:

    • 问题在于寻找 JVM,而不是寻找 JNI 库。
    【解决方案2】:

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

    【讨论】:

    • 感谢您的回答。不幸的是,$JAVA_HOME 的问题在于它在许多系统上都没有默认设置。
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 2012-12-02
      • 1970-01-01
      • 1970-01-01
      • 2023-04-05
      • 1970-01-01
      • 1970-01-01
      • 2017-02-21
      • 2015-01-22
      • 1970-01-01
      相关资源
      最近更新 更多