java、System.loadlibrary(“ someDLLFile”)が不定リンクエラーを取得する

StackOverflow https://stackoverflow.com/questions/1029559

質問

いくつかの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()がフォルダーの場所に関係なく自分のマシンで動作するのに、別のコンピューターでは動作しないのはなぜですか?

役に立ちましたか?

解決

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

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

他のヒント

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

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

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

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

欠点は、プログラムがプラットフォームに依存するディレクトリ名、ファイル拡張子などを処理していることです

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

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

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

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

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

   addDir( binPath );

非常にうまく機能します。

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

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top