web-dev-qa-db-ja.com

DLL from Java(JNA)を使用しようとしています。ライブラリ例外をロードできません

tutorial のNetBeansプロジェクトがあり、例外が発生します。

スレッド「メイン」の例外Java.lang.UnsatisfiedLinkError: Unable to load library 'simpleDLL':指定されたモジュールが見つかりませんでした。

SimpleDLL.dllをプロジェクトライブラリに配置しようとしましたが、system32フォルダにファイルがコピーされ、成功しませんでした。

12
Karloss

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");

それは私のために働いた、それを試してみて、それがあなたのために働くかどうか教えてください。

12
BackSlash

SimpleDLLが32ビットか64ビットかを確認してください。次に、JVMも32ビットまたは64ビットかどうかを確認します。それらは同じプラットフォーム用でなければなりません。

loadLibrary()load()に変更する場合は、絶対パスを指定することもできます: http://www.chilkatsoft.com/p/p_499.asp

5

私は32ビット(Xp)でのみ実行できました。

DLLをフォルダ「c:\ Windows\System32」に配置します

helloWorldDLL lib =(helloWorldDLL)Native.loadLibrary( "helloworldDLL"、helloWorldDLL.class);

エラーJava.lang.UnsatisfiedLinkError:Unable to load library "が続く場合は、Dependency Walkerを使用して依存DLLを表示してください。

Dependency Walker

2
Maurício

DLLファイルが壊れていない場合、この問題の3つの考えられる理由:

  1. 32ビット64ビットの互換性。 32ビットDLLは、32ビットjdkまたはjreでのみ実行できます。 Cygwinコマンドfile <filename>を使用すると、dllが32ビットか64ビットかを確認できます。

  2. dllは正しいパスに配置されていないため、Javaはそれを見つけることができません。一般的に、System32以外の絶対パスを使用して、パスが正しいことを確認できます。

  3. ロードしているdllには他のdllが必要です。

3番目の可能性をどのように処理できるか:

  1. jNIのSystem.loadLibrary() mthodを使用すると、JNAと比較して、より多くのヒントを得ることができます。 Exception in thread "main" Java.lang.UnsatisfiedLinkError: MyLibrary.dll: Can't find dependent libraries.一部のライブラリMyLibrary.dllが依存していないことを意味します。 dependency walker を使用すると、必要なdllがわかります。

  2. ロードするDLLの前にこれらのDLLをロードすることで、この問題を解決できます。

1
ZhaoGang

同じ問題があり、何らかの理由でDLLファイル名に大文字が含まれている場合でも、次のようにすべて小文字で読み込む必要があります。Native.loadLibrary("dlls/library.dll", YourInterface.class)

[〜#〜] not [〜#〜]これ:Native.loadLibrary("dlls/Library.dll", YourInterface.class)

0