Java Web Startを使用して、サードパーティ製のネイティブライブラリに依存するJavaアプリケーションを起動しています。これらのネイティブライブラリは、その後、LoadLibrary/dlopenを使用して依存関係として別のネイティブライブラリ(commonLib
)をロードします。Java Web Start - 他のネイティブ依存関係とのネイティブ依存関係のロード
Web Startを使用しない場合、ネイティブライブラリが同じディレクトリにある場合は、すべて正常に動作します。
Web Startは、しかし、jarファイルに詰め、私はJNLPファイルで参照されるネイティブライブラリが必要です:
<!-- Windows OS -->
<resources os="Windows">
<nativelib href="native/native-windows.jar" />
</resource>
<!-- Linux OS -->
<resources os="Linux">
<nativelib href="native/native-linux.jar" />
</resources>
<!-- Mac OSX -->
<resources os="Mac OS X">
<nativelib href="native/native-osx.jar"/>
</resources>
ネイティブライブラリが細かいロードが、彼らは彼らの依存関係をロードに失敗しますcommonLib
- ファイルが現在のライブラリ検索パス上にないjar/cacheフォルダに存在するため、C++ LoadLibrary/dlopen呼び出しが失敗します。 Windowsでは
ので、同じように、私は、JNIライブラリをロードしようとする前にJavaでプリロードcommonLib
することにより、この問題を解決することができました:
System.loadLibrary("commonLib");
System.loadLibrary("myNativeLib");
しかし、このアプローチは、OS X上では動作しません。 - ネイティブコードのdlopenが失敗します。 dlopenはすでに読み込まれている場合にライブラリを再度ロードしようとしないほどスマートではないようです。
Java Web Startの他のネイティブライブラリに依存するネイティブライブラリをパックして読み込むためのクロスプラットフォームの方法はありますか?
Jarsには、関係するすべてのネイティブが含まれていますか? –
はい、それをダブルチェックしました。 –