JNI使用哪种类加载器调用本机代码?

时间:2017-07-06 16:03:13

标签: java jar java-native-interface classloader native

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

A.jar中执行B.dll所有jna调用的类加载了CustomClassLoader,其中C.jarA.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

1 个答案:

答案 0 :(得分:0)

要回答您的问题,findClass文档说明:

  

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

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