17

例: 2 つの共有オブジェクトがあります (.dll にも同じことが当てはまります)。最初の共有オブジェクトはサードパーティ ライブラリからのもので、libA.so と呼びます。この一部を JNI でラップし、独自のライブラリ libB.so を作成しました。現在、libB は libA に依存しています。

Webstarting の場合、両方のライブラリが webstart 作業領域に配置されます。私の Java コードは libB をロードしようとします。この時点で、システム ローダーは、システム ライブラリ パスにない libA をロードしようとします (java.library.path は役に立ちません)。最終的な結果として、libB には満たされていないリンクがあり、使用できません。

libB の前に libA をロードしようとしましたが、それでもうまくいきません。OSが私のためにそのロードをしたいようです。静的にコンパイルする以外に、これを機能させる方法はありますか?

4

3 に答える 3

8

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

libBの前にlibAをロードすることは、それらのライブラリーの1つが説明されておらず、パスにない依存関係を持っていない限り、機能するはずです。私の理解では、システムのloadLibrary呼び出しに到達すると(つまり、Javaがjava.library.pathでライブラリを検出し、OSにロードするように指示している)、依存するライブラリを見つけるのはオペレーティングシステムに完全に依存しています。なぜなら、その時点でプロセスのライブラリをロードしているのはオペレーティングシステムであり、OSはシステムパスを調べる方法しか知らないからです。Webstartアプリの場合、これを設定するのは難しいようですが、静的コンパイルを伴わない方法があります。あなたはあなたの図書館がどこにあるかをシャッフルすることができるかもしれません-私は確信が持てません

カスタムクラスローダーを使用する場合は、loadLibraryとfindLibraryをオーバーライドして、クラスパスのjar内からライブラリを検索できるようにします。また、ネイティブライブラリの依存関係を認識させる場合(つまり、libBはlibAに依存し、libXはlibXに依存します。次に、libBをロードするときに、libAを最初にロードし、その通知を確認してlibXを最初にロードすることを確認できます。その後、OSは、パスにないライブラリを見つけようとしません。これは、扱いにくく、少し面倒です。 、ただし、Javaがそれらを検出し、それらすべてを正しい順序でロードすることを確認することは機能します。

于 2008-08-07T17:53:38.113 に答える
5

静的コンパイルは、依存する複数のネイティブ ライブラリを Web 起動する唯一の方法であることが判明しました。

于 2009-01-26T01:47:13.227 に答える
1

両方のネイティブ ライブラリは、次のようにリストされている署名済みのjar にパッケージ化されていますか?

<nativelib ...> 

JNLPファイルで?

于 2008-09-17T06:32:00.773 に答える