Java 本机代码中的JNI调用使用哪个类装入器?

Java 本机代码中的JNI调用使用哪个类装入器?,java,jar,java-native-interface,classloader,native,Java,Jar,Java Native Interface,Classloader,Native,我有A.jar,它使用jna调用一些本机代码B.dll,然后使用JNI调用C.jar A.jar中的类执行对B.dll的所有jna调用,该类加载了一个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的系统类加

我有
A.jar
,它使用jna调用一些本机代码
B.dll
,然后使用JNI调用
C.jar

A.jar
中的类执行对
B.dll
的所有jna调用,该类加载了一个
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
来回答您的问题,文档说明:

FindClass定位与当前本机程序关联的类加载器 方法;也就是说,声明 本机方法


您的问题的一个解决方案是将方法参数中的CustomClassLoader实例发送到C代码并将其缓存在那里,每当您需要进行类查找时,您都可以使用该classloader实例(调用方法findClass).

如果您不想让C.jar拥有与A.jar相同的类加载器,为什么要将其添加到同一个类加载器的URL列表中?这里的答案是让定制类加载器将系统类加载器作为委托,并让系统类加载器fin C.jar。但是从你的描述中很难理解为什么它现在不起作用,假设你的描述是准确的。所以在a.jar中有一个类Foo,它对B.dll进行JNA调用,我希望这个类用一个自定义类加载器加载,这样当B.dll使用JNI调用C.jar时,就会使用这个自定义类加载器。Foo仍然必须使用A.jar中的其他资源,这就是为什么A.jar必须位于加载Foo的自定义类加载器的URL列表中。然而,当我尝试这样做时,当B.dll通过JNI调用调用C.jar时,它似乎不会被自定义类加载器加载。