2017-07-06 17 views
0

A.jarは、jnaを使用してネイティブコードB.dllを呼び出すと、次にを呼び出すためにJNIを使​​用します。ネイティブコードでJNI呼び出しで使用されるクラスローダーはどれですか?

B.dllへのすべてのJNAの呼び出しを行いA.jarでクラスがC.jarA.jarはそのURLリストに追加しましたCustomClassLoaderがロードされている - A.jarのシステムクラスローダは、そのURLのリストでC.jarを持っていません。

ネイティブコードB.dllenv->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が使用されているときにどういうことを保証できますか?

+0

C.jarにA.jarと同じクラスローダを持たせたくない場合は、なぜ同じクラスローダーのURLリストに追加していますか?ここでの答えは、カスタムクラスローダーにデリゲートとしてシステムクラスローダーを持たせ、システムクラスローダーにC.jarを付けさせることです。しかし、あなたの記述が正確であると仮定して、なぜ今は動作しないのか、あなたの記述から理解するのは難しいです。 – EJP

+0

したがって、AjarにA.jarのクラスFooがあります。これはJNAがB.dllを呼び出すので、このクラスにカスタムクラスローダをロードすると、B.dllがJNIを使​​ってC.jarを呼び出すときに、カスタムクラスローダーが使用されます。 FooはA.jarの他のリソースを使用する必要があります.AjarはFooをロードするカスタムクラスローダのURLリストになければなりません。しかし、これを試してみると、C.jarがJNI呼び出しによってB.dllによって呼び出されたときに、カスタムクラスローダがロードされるように見えます。 –

答えて

0

あなたの質問に答えるために、findClassドキュメントの状態:

FindClassが現在のネイティブ 方法に関連したクラスローダを検索します。つまり、 ネイティブメソッドを宣言したクラスのクラスローダです。あなたは(メソッドにfindClassを呼び出して)そのクラスローダーのインスタンスを使用することができ、クラスの検索を行う必要がある時はいつでもあなたの問題へ

一つの解決策は、CコードにメソッドのパラメータにCustomClassLoaderインスタンスを送信し、そこにキャッシュすることができます。

関連する問題