【发布时间】:2013-10-09 12:28:45
【问题描述】:
背景
我有一个 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 中相当于 Linux 中的 LD_LIBRARY_PATH)。
$ LIBPATH=<jre-base-dir>/lib/ppc:<jre-base-dir>/lib/ppc/j9vm ./myprogram
问题
在使用 j9vm JVM 时,任何人都可以了解 AIX 上系统属性
com.ibm.oti.vm.bootstrap.library.path的真正用途吗?我的修复是解决问题的正确方法还是应该使用其他系统属性? (我尝试过
java.library.path,但似乎没有帮助。)
【问题讨论】:
-
您使用什么版本的 Java?我们有以下异常“线程“主”java.lang.UnsatisfiedLinkError 中的异常:fontmanager(在 com.ibm.oti.vm.bootstrap.library.path 中找不到)”。但是您的修复对我们不起作用。我们使用 IBM Java 1.6 SR14。
-
这里是版本信息: $ ./java -version ↵ java version "1.7.0" ↵ Java(TM) SE Runtime Environment (build pap3270sr5-20130619_01(SR5)) ↵ IBM J9 VM ( build 2.6, JRE 1.7.0 AIX ppc-32 20130617_152572 (JIT enabled, AOT enabled) ↵ J9VM - R26_Java726_SR5_20130617_1436_B152572 ↵ JIT - r11.b04_20130528_38954ifx1 ↵ GC - R26_Java726_SR5_20130617_1436_B152572 ↵ J9CL - 20130617_152572) ↵ JCL - 20130616_01 based on Oracle 7u25-b12跨度>
标签: jvm aix jvm-arguments