JNI を使用して Java プロジェクトに C++ コードをロードしようとしています。ロードするDLLがいくつかありますが、残念ながら、そのうちの2つの間に循環依存関係があります.dll Aにはdll Bが必要で、dll Aが必要です! DLL 間で循環的な依存関係を持つのはプログラミング設計として不適切であることはわかっていますが、私のプロジェクトでは、C++ コードはブラック ボックスです。
循環依存関係を持つ DLL をロードする方法はありますか?
私のコードは非常に単純です:
System.loadLibrary("myDLLA"); // needs dll B to be loaded!
System.loadLibrary("myDLLB"); // needs dll A to be loaded!
System.loadLibrary("myDLLC"); // needs dll B
// then call my native method implemented in dll C
Java ライブラリ パスは問題なく、2 つの DLL が含まれています (VM 引数として指定されているので、実行時にダンプしてチェックしました)。循環依存関係は Dependency Walker によって確認されました。
エラーは次のとおりです。
java.lang.UnsatisfiedLinkError: E:\...\myDLLA.dll: Can't find dependent libraries
at java.lang.ClassLoader$NativeLibrary.load(Native Method)
at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1928)
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1854)
at java.lang.Runtime.loadLibrary0(Runtime.java:845)
at java.lang.System.loadLibrary(System.java:1084)
私のプロジェクトは、Tomcat 6 サーバーにデプロイされた動的 Web プロジェクトとして Eclipse (Helios) で開発されています。