2017-07-06 33 views
0

我有A.jar,它使用jna调用一些本地代码B.dll,而该代码使用JNI调用C.jar本机代码中的JNI调用使用哪个类加载器?

这确实所有B.dll的JNA调用A.jar的类装载有CustomClassLoader具有C.jarA.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正在使用?

+0

如果您不希望C.jar具有与A.jar相同的类加载器,为什么要将它添加到同一个类加载器的URL列表中?这里的答案是让自定义类加载器将系统类加载器作为委托,并让系统类加载器查找C.jar。但从描述中很难理解为什么现在不行,假设你的描述是准确的。 – EJP

+0

所以在A.jar中有一个类Foo,JNA调用B.dll,并且我想要这个类加载一个自定义的类加载器,这样当B.dll使用JNI调用C.jar时,自定义类加载器将被使用。 Foo仍然必须使用A.jar中的其他资源,这就是为什么A.jar必须位于加载Foo的自定义类加载器的URL列表中。但是,当我尝试这样做时,似乎并不像C.jar通过JNI调用由B.dll调用时,会自定义类加载器加载。 –

回答

0

要回答你的问题,findClass文档指出:

findClass的定位与当前的本地 方法关联的类加载器;也就是声明了 本地方法的类的类加载器。

一个解决问题的方法可以在方法参数的C代码发送CustomClassLoader实例,并将它缓存在那里,只要你需要做的类查找您可以使用的类加载器实例(调用该方法的findClass)。

相关问题