我有A.jar
使用jna调用一些本机代码B.dll
,后者又使用JNI调用C.jar
。
A.jar
中执行B.dll
所有jna调用的类加载了CustomClassLoader
,其中C.jar
和A.jar
已添加到其网址列表中 - 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
?
答案 0 :(得分:0)
要回答您的问题,findClass文档说明:
FindClass定位与当前本机关联的类加载器 方法;也就是说,声明了类的类加载器 原生方法。
您的问题的一个解决方案是将方法参数中的CustomClassLoader实例发送到C代码并将其缓存在那里,每当您需要进行类查找时,您可以使用该类加载器实例(调用方法findClass)。