为什么后续的jni线程在currentThread()上返回null.getClassLoader()?

时间:2013-08-21 10:06:28

标签: java-native-interface

我从c ++启动线程并调用Java。 JVM本身正确设置了类路径,并将所有必需的jar传递给-Djava.class.path。

为什么"上下文类加载器"新线程中是否为null?

我有这个szenario:

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

在第一个线程中(它表示" main"在Eclipse中),所有三个对象都是有效的并包含类。在以下所有线程中cl都为空。

对我来说没有任何意义,如果我将类加载到JVM中,它们应该全局可用于每个线程,不应该吗? 由于某种原因,currCl和jbossCl中的类数量也大不相同。首先有~600而另一个有> 1000

1 个答案:

答案 0 :(得分:5)

我们遇到了同样的问题,令人费解。第一个线程可以加载类,但是连接到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()
);