チュートリアルのNetBeansプロジェクトが あり、例外が発生します。
スレッド"main" java.lang.UnsatisfiedLinkError: Unable to load library
'simpleDLL'の例外:指定されたモジュールが見つかりませんでした。
simpleDLL.dllをプロジェクトライブラリに入れようとしましたが、ファイルをsystem32フォルダーにコピーしましたが成功しませんでした。
DLLのロードでまったく同じ問題が発生しましたが、次のように解決しました。
Christian Kuetbachが言ったように、使用しているsimpleDLLがプロセッサのアーキテクチャと互換性があるかどうかを確認してください。32ビットDLLは64ビットマシンでは機能せず、64ビットDLLは32ビットマシンでは機能しません。ビットマシン。
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ビットかを確認します。それらは同じプラットフォーム用である必要があります。
http://www.chilkatsoft.com/p/p_499.asp
に変更loadLibrary()
した場合は、絶対パスを指定することもできます。load()
32ビット(Xp)でしか実行できませんでした。
DLLをフォルダ「c:\ Windows\System32」に配置します
helloWorldDLL lib =(helloWorldDLL)Native.loadLibrary( "helloworldDLL"、helloWorldDLL.class);
エラーjava.lang.UnsatisfiedLinkError:Unable to load library "が続く場合は、DependencyWalkerを使用して依存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
が依存していることを意味します。依存関係ウォーカーを使用する ことで、必要なdllを特定できます。
ロードしたいdllの前にこれらのdllをロードすることで、この問題を解決できます。
同じ問題があり、何らかの理由でdllファイル名に大文字が含まれている場合でも、次のようにすべて小文字を使用してロードする必要があります。
Native.loadLibrary("dlls/library.dll", YourInterface.class)
これではありません:Native.loadLibrary("dlls/Library.dll", YourInterface.class)