複数の依存するネイティブ ライブラリを Java Web で開始するにはどうすればよいですか?
-
08-06-2019 - |
質問
例:2 つの共有オブジェクトがあります (同じことが .dll にも適用されます)。最初の共有オブジェクトはサードパーティ ライブラリからのもので、これを libA.so と呼びます。この一部を JNI でラップし、独自のライブラリ libB.so を作成しました。これで、libB は libA に依存します。
Web スタート時、両方のライブラリは Web スタート作業領域に配置されます。私の Java コードは libB をロードしようとします。この時点で、システム ローダーは、システム ライブラリ パスにない libA をロードしようとします (java.library.path は役に立ちません)。最終的に、libB には満足できないリンクが存在し、使用できなくなります。
libB の前に libA をロードしようとしましたが、それでも動作しません。OS がその読み込みを実行したいようです。静的コンパイル以外にこれを機能させる方法はありますか?
解決 2
静的コンパイルは、複数の依存するネイティブ ライブラリを Web 起動する唯一の方法であることが判明しました。
他のヒント
これが Webstart でまったく同じ方法で処理されるかどうかはわかりませんが、デスクトップ アプリケーションで一連のネイティブ ライブラリ (この場合は DLL) を処理するときにこの状況に遭遇しました。
これらのライブラリのいずれかに原因不明のパス内にない依存関係がある場合を除き、libB の前に libA をロードすると機能するはずです。私の理解では、システムのloadLibrary呼び出しに達すると(つまり、Java は java.library.path でライブラリを見つけて、それをロードするように OS に指示しています) - 依存ライブラリを見つけるかどうかはオペレーティング システムに完全に依存しています。その時点で、ライブラリをロードしているのはオペレーティング システムであるためです。 OS はシステム パスを調べる方法のみを知っています。Webstart アプリの場合、これを設定するのは難しいように思えますが、静的コンパイルを必要としない回避方法があります。ライブラリの場所をシャッフルできるかもしれません - わかりません
カスタム クラスローダーを使用する場合、loadLibrary と findLibrary をオーバーライドして、クラスパス内の jar 内からライブラリを検索できるようにすることができます。また、ネイティブ ライブラリの依存関係 (つまり、libB は libA に依存し、libA は libX に依存します。その後、libB をロードするときに自分自身を捕まえて、最初に libA をロードすることを確認し、その通知を確認して最初に libX をロードすることができます。そうすれば、OS はパスにないライブラリを見つけようとしません。これは扱いにくく、少し面倒ですが、Java がそれらを確実に見つけて、すべてを正しい順序でロードすることで機能する可能性があります。
両方のネイティブ ライブラリが 1 つのパッケージにパッケージ化されていますか 署名済み としてリストされているjar
<nativelib ...>
JNLP ファイル内で?