10

簡単に言うと、実行可能な jar があり、jni.dllこれは に依存していlib.dllます。そして、私はとても恐ろしいUnsatisfiedLinkError.

私の経験からすると、この答えはかなり近いですが、問題を解決することはできません。でdllの存在するフォルダを指定しjava.library.pathても動作しません。PATHWindows環境変数も変更する必要があります。java.library.path実際、 WindowsのデフォルトはPATH.

これを修正する「きれいな」方法はありますか?Windows 用のインストーラーを作成したいのですが、エンド ユーザーが手動で作業する必要がないように、この問題にどのように対処すればよいか考えています。

編集:

私が実装したのは次のとおりです。アプリケーションには、サポートされているすべてのアーキテクチャの動的ライブラリを含む「native_libs」というフォルダーが付属しています。構造は次のとおりです。

/
+- native_libs/
   +- windows/
   |  +- x86/
   |  |  +- ...
   |  +- x64/
   |     +- ...
   |
   +- linux/
   |  +- x86/
   |  |  +- ...
   |  +- x64/
   |     +- ...
   |
   +- libs/
      +- ...

実行時に、アプリケーションの初期化中に、正しい JRE アーキテクチャとシステム OS が検出され、適切なライブラリ ファイルが libs/ フォルダーにコピーされます。はjava.library.path、一般的なハックを使用して実行時にも設定されています。最後に、PATHネイティブ ランチャーを使用して Windows の環境変数を設定します。

改善の余地はありますか?ファイルと同じディレクトリに dll をコピーすると、変数と変数jarを設定する必要がなくなるのではないでしょうか? dll の読み込みも調査する必要があります。これにより、ファイルをコピーする必要がなくなります。java.library.pathPATHSystem.load()

4

4 に答える 4

12

java.library.pathSystem.loadLibrary()動的ライブラリ ファイルを検索するディレクトリを指定します。コードでシステム プロパティを変更しjava.library.pathても、何の効果もありません。java.library.pathJava に初期値を「忘れ」させ、システム プロパティの内容を再評価させるハックがあります。

ただし、依存ライブラリは Java によって読み込まれるのではなく、Windows によって読み込まれます。Windows は を気にせず、環境変数java.library.pathのみを気にします。PATH唯一のオプションはPATH、Java プロセスに合わせて調整することです。たとえば、バッチ ファイルから起動する場合はPATH、Java 呼び出しの直前に環境変数を変更します。

于 2012-09-24T14:23:21.733 に答える
1

最も簡単な解決策は、すべての .dll が「.」内にあることを確認することです。あなたが実行するとき。

于 2012-09-25T01:52:21.547 に答える
0

jni.dll が依存する dll を「現在の作業ディレクトリ」に配置し、System.getProperty("user.dir")実行時にこれをチェックして、「現在の作業ディレクトリ」を把握します。

于 2014-01-25T17:53:03.053 に答える
0

OS が依存ライブラリを見つけられないことが問題である場合、System.loadLibrary()メイン ライブラリをロードする前に、それを介してロードしようとしましたか?

于 2012-09-24T16:52:49.967 に答える