2

背景

我有一个 C++ 程序,它在内部加载 JVM,然后使用 JNI 调用 JVM 中的代码。这可以在包括 AIX 在内的多个平台上运行。但是,当在 AIX 上启动 JVM 时,一切都很好,直到我调用一些需要访问作为 JRE 的一部分提供的本机代码的代码。然后我遇到了这个错误消息:

java.lang.UnsatisfiedLinkError: net (Not found in com.ibm.oti.vm.bootstrap.library.path)

问题是 JVM 找不到共享库libnet.so。如果我从 JVM 中运行的 Java 代码中转储com.ibm.oti.vm.bootstrap.library.path系统属性的值,我会看到默认情况下(即不是我设置它)它具有以下值:

<jre-base-dir>/lib/ppc/default:<jre-base-dir>/lib/ppc

从错误消息中我猜想将其更改为包含所在的目录是一个好主意libnet.so。但是,这个共享库<jre-base-dir>/lib/ppc已经在 设置的路径中com.ibm.oti.vm.bootstrap.library.path,因此错误消息似乎不正确。

对此系统属性的不同值进行试验使我相信 AIX j9vm 仅使用它来加载内部 JVM 共享库(如libjclse7b_26.so),而不是本机代码实现(如libnet.so)。

我的修复

为了解决我的问题,我不得不更改LIBPATH环境变量(在 AIX 中相当于LD_LIBRARY_PATHLinux)。

$ LIBPATH=<jre-base-dir>/lib/ppc:<jre-base-dir>/lib/ppc/j9vm ./myprogram

问题

  1. com.ibm.oti.vm.bootstrap.library.path在使用 j9vm JVM 时,任何人都可以了解 AIX 上系统属性的真正用途吗?

  2. 我的修复是解决问题的正确方法还是应该使用其他一些系统属性?(我试过java.library.path了,但似乎没有帮助。)

4

1 回答 1

1

就我而言,它显示错误消息:

java.lang.UnsatisfiedLinkError:awt(在 com.ibm.oti.vm.bootstrap.library.path 中找不到)

我通过将 /usr/java6_64/jre/lib/ppc64/libawt.so 复制到 /usr/java6_64/jre/lib/ppc64/j9vm 并创建符号链接 libawt.a 到 libawt.so 来解决我的问题

我设置了 LD_LIBRARY_PATH LD_LIBRARY_PATH="/usr/java6_64/jre/lib/ppc64:/usr/java6_64/jre/lib/ppc64/j9vm"; 导出 LD_LIBRARY_PATH

于 2013-10-09T04:28:45.133 回答