java - 起動 - jnlpファイル




どのようにして、複数の依存したネイティブライブラリをJava Webstartで起動できますか? (2)

例:2つの共有オブジェクトがあります(.dllにも同じ)。 最初の共有オブジェクトは第三者のライブラリからのもので、libA.soと呼びます。 私はこれをJNIで包み込み、独自のライブラリlibB.soを作成しました。 今、libBはlibAに依存します。

ウェブスタート時に、両方のライブラリはウェブスタート作業領域の一部です。 私のJavaコードはlibBをロードしようとします。 この時点で、システム・ローダーはシステム・ライブラリー・パスにないlibAをロードしようとします(java.library.pathはこれを助けません)。 結局のところ、libBには不満足なリンクがあり、使用できません。

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


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

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

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


両方のネイティブライブラリは、次のようにリストされた署名付きの jarファイルにパッケージ化されていますか?

<nativelib ...> 

JNLPファイルでは?





nativelibrary