A.jar
は、jnaを使用してネイティブコードB.dll
を呼び出すと、次にを呼び出すためにJNIを使用します。ネイティブコードでJNI呼び出しで使用されるクラスローダーはどれですか?
B.dll
へのすべてのJNAの呼び出しを行いA.jar
でクラスがC.jar
とA.jar
はそのURLリストに追加しましたCustomClassLoader
がロードされている - A.jar
のシステムクラスローダは、そのURLのリストでC.jar
を持っていません。
ネイティブコードB.dll
がenv->FindClass('some/class/in/c.jar')
を呼び出すと、クラスが見つかりません。 CustomClassLoader
を削除し、A.jar
のシステムクラスローダーのURLリストにC.jar
を追加すると、env->FindClass('some/class/in/c.jar')
はそのクラスを見つけることができます。しかし、A.jar
のクラスは、と同じクラスローダを持つことは望ましくありません。実行がC.jar
に到着するため、A.jar
にはCustomClassLoader
がロードされています。
したがって、B.dll
がJNIコールenv->FindClass('some/class/in/c.jar/')
CustomClassLoader
が使用されているときにどういうことを保証できますか?
C.jarにA.jarと同じクラスローダを持たせたくない場合は、なぜ同じクラスローダーのURLリストに追加していますか?ここでの答えは、カスタムクラスローダーにデリゲートとしてシステムクラスローダーを持たせ、システムクラスローダーにC.jarを付けさせることです。しかし、あなたの記述が正確であると仮定して、なぜ今は動作しないのか、あなたの記述から理解するのは難しいです。 – EJP
したがって、AjarにA.jarのクラスFooがあります。これはJNAがB.dllを呼び出すので、このクラスにカスタムクラスローダをロードすると、B.dllがJNIを使ってC.jarを呼び出すときに、カスタムクラスローダーが使用されます。 FooはA.jarの他のリソースを使用する必要があります.AjarはFooをロードするカスタムクラスローダのURLリストになければなりません。しかし、これを試してみると、C.jarがJNI呼び出しによってB.dllによって呼び出されたときに、カスタムクラスローダがロードされるように見えます。 –