2013-08-21 68 views
1

我開始從C++的線程和調用到Java。 JVM本身具有正確設置的類路徑,並將所有必需的jar傳遞給-Djava.class.path。爲什麼後續jni線程在currentThread()。getClassLoader()上返回null?

爲什麼「上下文類加載器」在新線程中永遠爲空?

我有這個SZENARIO:

ClassLoader cl = Thread.currentThread().getContextClassLoader(); // null on new threads 
ClassLoader currCl = MyClass.class.getClassLoader(); 
ClassLoader jbossCl = org.jboss.remoting.InvocationResponse.class.getClassLoader(); 

在第一個線程(它說在Eclipse「主」),所有的三個對象是有效的,含有類。在所有跟隨的線程cl爲空。

對我來說沒有任何意義,如果我將類加載到JVM中,它們應該可用於全局的每個線程,不是嗎? 由於某些原因,currCl和jbossCl中的類也有大量不同。第一個有〜600,另一個有> 1000

+0

「開始從C++線程和調用到Java」這是什麼意思:

這可以像做什麼? – dhblah

+0

您介意向我們展示您如何在JNI代碼中創建線程? –

回答

2

我們有同樣的問題,這是令人莫名其妙的。第一個線程可以加載類,但附加到JVM的本地線程不能。您的問題與以下解決方案具有相同的解決方案: Service loader does not locate service provider class, even though class is in same JAR file as META-INF/services 主持人可能希望將其標記爲重複,但問題非常不同 - 聽起來很不一樣。

從這個文檔http://docs.oracle.com/javase/1.5.0/docs/guide/jni/spec/invocation.html

「當一個線程被附加到VM,上下文類加載器是引導加載程序」。

通過AttachCurrentThread()附加到JVM的任何本機線程只獲取引導類加載器,甚至不是系統類加載器。除非您明確修復新線程的上下文類加載器,否則不能從新線程加載類。

java.lang.Thread.currentThread().setContextClassLoader(
    java.lang.ClassLoader.getSystemClassLoader() 
);