我有A.jar
,它使用jna调用一些本地代码B.dll
,而该代码使用JNI调用C.jar
。本机代码中的JNI调用使用哪个类加载器?
这确实所有B.dll
的JNA调用A.jar
的类装载有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
正在使用?
如果您不希望C.jar具有与A.jar相同的类加载器,为什么要将它添加到同一个类加载器的URL列表中?这里的答案是让自定义类加载器将系统类加载器作为委托,并让系统类加载器查找C.jar。但从描述中很难理解为什么现在不行,假设你的描述是准确的。 – EJP
所以在A.jar中有一个类Foo,JNA调用B.dll,并且我想要这个类加载一个自定义的类加载器,这样当B.dll使用JNI调用C.jar时,自定义类加载器将被使用。 Foo仍然必须使用A.jar中的其他资源,这就是为什么A.jar必须位于加载Foo的自定义类加载器的URL列表中。但是,当我尝试这样做时,似乎并不像C.jar通过JNI调用由B.dll调用时,会自定义类加载器加载。 –