java、System.loadlibrary(“ someDLLFile”)が不定リンクエラーを取得する
-
06-07-2019 - |
質問
いくつかの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に存在するかどうか、他のマシンを確認します。