背景
我有一个 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_PATH
Linux)。
$ LIBPATH=<jre-base-dir>/lib/ppc:<jre-base-dir>/lib/ppc/j9vm ./myprogram
问题
com.ibm.oti.vm.bootstrap.library.path
在使用 j9vm JVM 时,任何人都可以了解 AIX 上系统属性的真正用途吗?我的修复是解决问题的正确方法还是应该使用其他一些系统属性?(我试过
java.library.path
了,但似乎没有帮助。)