92

JNIを使​​用するJavaプロジェクトに取り組んでいます。JNIは、自分で作成したカスタムライブラリ(mylib.dllなど)を呼び出します。これは、サードパーティのライブラリlibsndfile-1.dllに依存します。

プログラムを実行すると、次のようにクラッシュします

java.lang.UnsatisfiedLinkError:  C:\...path...\mylib.dll: Can't find dependent libraries.

私はこのサイト(および他のサイト)を検索し、いくつかの修正を試みました:

  1. 依存関係ウォーカーを実行しました。DWは、libsndfileに必要な2つのライブラリ、MPR.DLLとSHLWAPI.DLLに「未解決のインポート」があるという警告をいくつか出しましたが、DW FAQには、これらの警告は安全に無視できると書かれています。

  2. ここで提案されているように、mylib.dllのメソッド名を修正しました。メソッド名はコンパイラによってなんらかの形で壊されていましたが、リンカーフラグを追加したところ、dllメソッド名がjniヘッダーファイルのメソッド名と完全に一致するようになりました。

  3. これらのDLLをすべて同じディレクトリ(それらを呼び出す.jarと同じディレクトリ)に配置して、正しいPATH上にあることを確認します。

サイコロはありません。

誰かが何が起こっているのか分かりますか?

私はMacBookProのVisualStudio2010で(Parallels経由で)開発を行っています。私は東芝のラップトップのWindowsXPでテストを行っています。

4

18 に答える 18

58

クラスパスと共有ライブラリの検索パスは互いにほとんど関係がないと確信しています。The JNI Book (確かに古いものです) によると、Windows でシステム プロパティを使用しない場合java.library.path、DLL は現在の作業ディレクトリまたは WindowsPATH環境変数にリストされているディレクトリにある必要があります。


アップデート:

オラクルがウェブサイトから PDF を削除したようです。上記のリンクを、テキサス大学アーリントン校にある PDF のインスタンスを指すように更新しました。

また、Oracle の HTML バージョンのJNI 仕様も読むことができます。それはJava WebサイトのJava 8セクションにあるので、うまくいけばしばらくの間存在するでしょう.


更新 2:

少なくともJava 8(以前のバージョンはチェックしていません)では、次のことができます:

java -XshowSettings:properties -version

共有ライブラリの検索パスを見つけます。java.library.pathその出力でプロパティの値を探します。

于 2011-05-23T03:36:16.133 に答える
22

この興味深いケースをお知らせしたいと思います。上記の方法をすべて試した後も、エラーはまだ残っています。奇妙なことに、Windows 7 コンピューターでは動作しますが、Windows XP では動作しません。次に、依存関係ウォーカーを使用し、Windows XP で DLL 要件として VC++ ランタイムがないことがわかりました。ここにVC++ ランタイム パッケージをインストールすると、魅力的に動作します。私を悩ませたのは、直感的にJNI依存dllがそこにあるにもかかわらず、依存ライブラリが見つからないことを伝え続けていることですが、最終的にJNI依存dllには別の依存dlが必要であることが判明しました。これが役立つことを願っています。

于 2012-05-11T10:20:30.303 に答える
16

JNI ライブラリをロードする必要があります。

System.loadLibraryは、JVM パス (JDK bin パス) から DLL をロードします。

パスを指定して明示的なファイルをロードする場合は、System.load ()を使用します。

参照: Java の System.load() と System.loadLibrary の違い

于 2014-08-07T15:13:27.547 に答える
6

インストール時javacvおよびopencvEclipseとの組み合わせ時に、XPマシンで同じ問題が発生しました。次のファイルが不足していることが判明しました。

  • msvcp100.dll
  • msvcr100.dll

これらがインストールされると、プロジェクトはコンパイルされ、正常に実行されました。

于 2012-10-05T22:16:58.427 に答える
6

ライブラリ パスが正しいかどうかを確認してください。もちろん、次のコードを使用してライブラリ パス パスを確認できます。 System.out.println(System.getProperty("java.library.path"));

Java アプリケーションを起動するときにjava.library.pathを指定できます。

java -Djava.library.path=path ...
于 2013-04-29T08:05:23.740 に答える
1

私はまったく同じ問題を抱えていましたが、最終的には解決しました。

すべての依存 DLL を mylib.dll が保存されているフォルダーと同じフォルダーに配置し、JAVA コンパイラーがそれを見つけられることを確認します (コンパイル パスに mylib.dll がない場合、コンパイル中にこれを報告するエラーが発生します)。注意すべき重要なことは、すべての依存ライブラリが mylib.dll と同じバージョンであることを確認する必要があることです。たとえば、mylib.dll がリリース バージョンの場合、すべての依存ライブラリのリリース バージョンもそこに配置する必要があります。 .

これが同じ問題に遭遇した他の人に役立つことを願っています。

于 2011-10-09T09:09:28.097 に答える
-2
  1. http://tess4j.sourceforge.net/usage.htmlにアクセスして、Visual C++ Redistributable for VS2012
  2. ダウンロードして実行するVSU_4\vcredist_x64.exeVSU_4\vcredist_x84.exe、システム構成に応じて
  3. 他のライブラリ (例: ) と一緒に、ファイルdllをフォルダー内に配置します。lib\lib\win32-x86\your dll files
于 2015-09-22T12:27:43.373 に答える