gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 01:21:35 29 4
gpt4 key购买 nike

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

为什么“上下文类加载器”在新线程中永远为空?

我有这个场景:

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

在第一个线程中(在 Eclipse 中称为“main”),所有三个对象都是有效的并且包含类。在所有后续线程中,cl 为空。

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

最佳答案

我们遇到了同样的问题,这令人费解。第一个线程可以加载类,但附加到 JVM 的 native 线程不能。您的问题具有与以下相同的解决方案: 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 的 native 线程只能获得引导类加载器,甚至不能获得系统类加载器。除非您明确修复新线程的上下文类加载器,否则无法从新线程加载类。

这可以像这样完成:

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

关于java-native-interface - 为什么后续的 jni 线程在 currentThread().getClassLoader() 上返回 null?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18354535/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com