1. ホーム
  2. java

[解決済み] JNIプロジェクトでUnsatisfiedLinkError (Can't find dependent libraries)が発生した場合の対処方法

2022-03-08 20:55:01

質問

私はJNIを使用するJavaプロジェクトに取り組んでいます。 JNIは、私自身が書いたカスタムライブラリ(仮にmylib.dllとします)を呼び出し、それはサードパーティライブラリ、libsndfile-1.dllに依存しています。

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

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

このサイト(や他のサイト)を検索して、いろいろな修正を試しました。

  1. dependency walkerを実行しました。DW はいくつかの警告を出しました -- libsndfile が必要とする二つのライブラリ MPR.DLL と SHLWAPI.DLL に "unresolved imports" があること -- しかし DW FAQ これらの警告は無視しても問題ないとのことでした。

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

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

ダメでした。

どなたか心当たりのある方はいらっしゃいますか?

私はMacBook pro(Parallels経由)でVisual Studio 2010で開発をしています。テストは東芝のノートパソコンでWindows XPで行っています。

どのように解決するのですか?

クラスパスと共有ライブラリの検索パスはあまり関係ないと思うのですが。 によると JNIブック (確かに古いですが) Windows では、もし java.library.path システム・プロパティを使用する場合、DLL は現在の作業ディレクトリか、Windows の [ファイル] メニューにあるディレクトリにある必要があります。 PATH 環境変数


更新しました。

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

また、オラクルのHTML版も読むことができます。 JNI仕様書 . これは、JavaウェブサイトのJava 8のセクションにあるので、しばらくは使えると思います。


アップデート2

少なくともJava 8では(それ以前のバージョンは未確認)できます。

java -XshowSettings:properties -version

を使って、共有ライブラリの検索パスを探します。 の値を探します。 java.library.path プロパティが出力されます。