1

いくつかの JNI フックを C++ ライブラリに書き込み、Java サーバー プロジェクト用にいくつかの DLL ファイルを作成しました。DLL ファイルと jar ファイルが「C:/server」の下の同じフォルダーにあるとします。

以下を使用してこれらの DLL ファイルにアクセスしています。

System.loadLibrary("someDLLFile");

C++ コードを必要とするクラスで。

私が直面している問題は、このサーバーを自分のマシンで実行すると、「サーバー」フォルダーの場所に関係なく、すべてが正常に機能することです。しかし、同僚にテストしてもらうと、次のような結果が得られます。

java.lang.UnsatisfiedLinkError no someDLLFile in java.library.path

DLL ファイルを jar ファイルと同じフォルダーに配置したいのですが、誰かに PATH 変数を構成させたくないのです。

System.loadLibrary() がフォルダーの場所に関係なく自分のマシンでは機能するのに、別のコンピューターでは機能しないのはなぜですか?

4

4 に答える 4

4

DLL (またはそれが依存する DLL、つまり msvcr90.dll など) がマシンの PATH にあるが、他のマシンにはないため、これは機能します。

PATH env-var または java.library.path プロパティを設定してファイルにディレクトリを含めるか、Java がデフォルトで見つける場所に dll を保存します (展開戦略とプラットフォームに応じて、ここには多くのオプションがあります)。

于 2009-06-22T21:50:56.530 に答える
1

1 つのオプションは、VM の起動時にコマンド ラインでディレクトリを指定することです。

java -classpath C:\server -Djava.library.path=C:\server somePackage.Main

別のオプションは、System.loadの代わりに使用することですSystem.loadLibrary

URL url = Test.class.getResource("someDLLFile.dll");
String f = new File(url.getFile()).getAbsolutePath();
System.load(f);

欠点は、プログラムがプラットフォームに依存するディレクトリ名、ファイル拡張子などを扱うようになったことです。

于 2009-06-22T22:41:17.723 に答える
0

これが役立つかどうかはわかりませんが、いくつかのプロジェクトに次のものを含めました。

http://forums.sun.com/thread.jspa?threadID=707176

ネイティブ ライブラリをロードします。

そして、binディレクトリをロードするだけです

    String binPath = new File(".").getAbsolutePath() 
                     + System.getProperty("file.separator") + "bin";

   addDir( binPath );

それはかなりうまくいきます。

しかし、繰り返しになりますが、これが事実であるかどうかはわかりません。

于 2009-06-22T22:50:31.730 に答える
0

depends.exe をダウンロードして、dll がシステム上の他の dll に依存しているかどうかを確認してください。存在する場合は、そのような dll がパスに存在するかどうか、他のマシンを確認します。

于 2015-11-12T15:42:53.083 に答える