2017-07-06 69 views
0

我有A.jar,它使用jna調用一些本地代碼B.dll,而該代碼使用JNI調用C.jar本機代碼中的JNI調用使用哪個類加載器?

這確實所有B.dll的JNA調用A.jar的類裝載有CustomClassLoader具有C.jarA.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正在使用?

+0

如果您不希望C.jar具有與A.jar相同的類加載器,爲什麼要將它添加到同一個類加載器的URL列表中?這裏的答案是讓自定義類加載器將系統類加載器作爲委託,並讓系統類加載器查找C.jar。但從描述中很難理解爲什麼現在不行,假設你的描述是準確的。 – EJP

+0

所以在A.jar中有一個類Foo,JNA調用B.dll,並且我想要這個類加載一個自定義的類加載器,這樣當B.dll使用JNI調用C.jar時,自定義類加載器將被使用。 Foo仍然必須使用A.jar中的其他資源,這就是爲什麼A.jar必須位於加載Foo的自定義類加載器的URL列表中。但是,當我嘗試這樣做時,似乎並不像C.jar通過JNI調用由B.dll調用時,會自定義類加載器加載。 –

回答

0

要回答你的問題,findClass文檔指出:

findClass的定位與當前的本地 方法關聯的類加載器;也就是聲明瞭 本地方法的類的類加載器。

一個解決問題的方法可以在方法參數的C代碼發送CustomClassLoader實例,並將它緩存在那裏,只要你需要做的類查找您可以使用的類加載器實例(調用該方法的findClass)。

相關問題