バックグラウンド
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
質問
com.ibm.oti.vm.bootstrap.library.path
j9vm JVM を使用する場合、AIXでのシステム プロパティの本当の目的を明らかにできる人はいますか?私の修正は問題を解決する正しい方法ですか、それとも他のシステム プロパティを使用する必要がありますか? (試してみ
java.library.path
ましたが、役に立たないようです。)