問題

例:私は2つの共有オブジェクトを持っています(.dllsにも同じです)。最初の共有オブジェクトはthird-partyライブラリからのもので、libA.soと呼びます。私はJNIでこれのいくつかをラップし、自分のライブラリlibB.soを作成しました。今libBはlibAに依存します。

Webstartingのとき、両方のライブラリはいくつかのWebstart作業領域の場所です。私のJavaコードはlibBをロードしようとします。この時点で、システムローダーは、システムライブラリパスにないlibAをロードしようとします(java.library.pathはこれを助けません)。最終的な結果は、libBに不満なリンクがあり、使用で

私はlibBの前にlibAをロードしようとしましたが、それでも動作しません。 OSは私のためにそのロードをしたいと思っているようです。静的にコンパイルする以外にこの作業を行う方法はありますか?

  ベストアンサー

これがwebstartとまったく同じ方法で処理されるかどうかはわかりませんが、ネイティブライブラリのセット(私たちの場合はdlls)を扱うときに、デスクトップアプリケーションでこの状況に遭遇しました。

libBの前にlibAをロードすると、それらのライブラリの1つがパスにないかどうかに依存しない限り、動作するはずです。私の理解では、システムのloadLibrary呼び出しに到達すると(つまり、Javaはjava.library.pathでライブラリを見つけ、OSにロードするように指示しています)、依存するライブラリを見つけるためにオペレーティングシステムに完全に依存しています。その時点では、プロセスのライブラリをロードするオペレーティングシステムであり、OSはシステムを見る方法を知っているだけです。

カスタムクラスローダーを使用する場合は、クラスパス内のjarファイル内からライブラリを見つけることができるようにloadLibraryとFindLibraryをオーバーライドできます。また、ネイティブライブラリの依存関係を認識させると(つまりlibBはlibXに依存します)、libBをロードするときにlibAを最初にロードし、その通知をチェックしてlibXをロードすることができます。その後、OSはあなたのパスにないライブラリを見つけようとしません。それ

  同じタグがついた質問を見る

javajava-native-interfacejava-web-start