2

バックグラウンド

JVM を内部的にロードし、JNI を使用して JVM 内のコードを呼び出す C++ プログラムがあります。これは、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

質問

  1. com.ibm.oti.vm.bootstrap.library.pathj9vm 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 に答える