tutorial のNetBeansプロジェクトがあり、例外が発生します。
スレッド「メイン」の例外Java.lang.UnsatisfiedLinkError: Unable to load library
'simpleDLL':指定されたモジュールが見つかりませんでした。
SimpleDLL.dllをプロジェクトライブラリに配置しようとしましたが、system32フォルダにファイルがコピーされ、成功しませんでした。
DLLの読み込みでまったく同じ問題が発生しました。この方法で解決しました。
DLLに互換性がある場合、問題はあなたのJavaライブラリパスにある可能性があります。私はDLL user.dir
ディレクトリを作成してから、次のコードを使用しました。
Javaライブラリパスをuser.dir
に設定するか、必要に応じて別のパスを設定します。
String myLibraryPath = System.getProperty("user.dir");//or another absolute or relative path
System.setProperty("Java.library.path", myLibraryPath);
ライブラリをロードします。
System.loadLibrary( "libraryWithoutDLLExtension");
それは私のために働いた、それを試してみて、それがあなたのために働くかどうか教えてください。
SimpleDLLが32ビットか64ビットかを確認してください。次に、JVMも32ビットまたは64ビットかどうかを確認します。それらは同じプラットフォーム用でなければなりません。
loadLibrary()
をload()
に変更する場合は、絶対パスを指定することもできます: http://www.chilkatsoft.com/p/p_499.asp
私は32ビット(Xp)でのみ実行できました。
DLLをフォルダ「c:\ Windows\System32」に配置します
helloWorldDLL lib =(helloWorldDLL)Native.loadLibrary( "helloworldDLL"、helloWorldDLL.class);
エラーJava.lang.UnsatisfiedLinkError:Unable to load library "が続く場合は、Dependency Walkerを使用して依存DLLを表示してください。
DLLファイルが壊れていない場合、この問題の3つの考えられる理由:
32ビット64ビットの互換性。 32ビットDLLは、32ビットjdkまたはjreでのみ実行できます。 Cygwinコマンドfile <filename>
を使用すると、dllが32ビットか64ビットかを確認できます。
dllは正しいパスに配置されていないため、Javaはそれを見つけることができません。一般的に、System32
以外の絶対パスを使用して、パスが正しいことを確認できます。
ロードしているdllには他のdllが必要です。
3番目の可能性をどのように処理できるか:
jNIのSystem.loadLibrary()
mthodを使用すると、JNAと比較して、より多くのヒントを得ることができます。 Exception in thread "main" Java.lang.UnsatisfiedLinkError: MyLibrary.dll: Can't find dependent libraries.
一部のライブラリMyLibrary.dll
が依存していないことを意味します。 dependency walker を使用すると、必要なdllがわかります。
ロードするDLLの前にこれらのDLLをロードすることで、この問題を解決できます。
同じ問題があり、何らかの理由でDLLファイル名に大文字が含まれている場合でも、次のようにすべて小文字で読み込む必要があります。Native.loadLibrary("dlls/library.dll", YourInterface.class)
[〜#〜] not [〜#〜]これ:Native.loadLibrary("dlls/Library.dll", YourInterface.class)