我有A.jar
,它使用jna調用一些本地代碼B.dll
,而該代碼使用JNI調用C.jar
。本機代碼中的JNI調用使用哪個類加載器?
這確實所有B.dll
的JNA調用A.jar
的類裝載有CustomClassLoader
具有C.jar
和A.jar
加入到它的URL列表 - A.jar
的系統類加載器沒有在它的URL列表C.jar
。
當B.dll
中的本機代碼調用env->FindClass('some/class/in/c.jar')
時,它找不到該類。如果我刪除CustomClassLoader
並將C.jar
添加到A.jar
的系統類加載器的URL列表中,則env->FindClass('some/class/in/c.jar')
能夠找到該類。但是,我真的很喜歡A.jar
中的類加載CustomClassLoader
,因爲當執行到達C.jar
時,我不希望代碼具有與A.jar
相同的類加載器。
那麼,是否有可能以某種方式確保當B.dll
運行JNI調用env->FindClass('some/class/in/c.jar/')
CustomClassLoader
正在使用?
如果您不希望C.jar具有與A.jar相同的類加載器,爲什麼要將它添加到同一個類加載器的URL列表中?這裏的答案是讓自定義類加載器將系統類加載器作爲委託,並讓系統類加載器查找C.jar。但從描述中很難理解爲什麼現在不行,假設你的描述是準確的。 – EJP
所以在A.jar中有一個類Foo,JNA調用B.dll,並且我想要這個類加載一個自定義的類加載器,這樣當B.dll使用JNI調用C.jar時,自定義類加載器將被使用。 Foo仍然必須使用A.jar中的其他資源,這就是爲什麼A.jar必須位於加載Foo的自定義類加載器的URL列表中。但是,當我嘗試這樣做時,似乎並不像C.jar通過JNI調用由B.dll調用時,會自定義類加載器加載。 –