我正在用C++编写一些JNI代码,用于从Windows XP上的applet调用.我已经能够成功运行applet并加载和调用JNI库,甚至可以调用其他DLL中的函数.我通过设置PATH系统环境变量来包含我所有DLL所在的目录.
所以,问题是我添加了另一个使用新外部DLL的调用,并且在加载库时突然抛出了UnsatisfiedLinkError.消息是:'找不到指定的过程'.这似乎不是一个缺少依赖DLL的问题,因为我可以删除一个从属DLL并获得有关从属DLL丢失的不同消息.从我在网上找到的内容来看,似乎这条消息意味着DLL中缺少本机Java函数实现,但奇怪的是它没有这些额外的代码就可以正常工作.
有谁知道这可能导致什么?哪些类型的东西可以为UnsatisifedLinkError提供"指定的过程无法找到"消息?
我解决了这个问题.这真是太过分了.对于UnsatisfiedLinkError,"无法找到指定的过程"消息表示无法找到根dll或从属dll中的函数.在JNI情况下,最可能的原因是本机JNI函数未正确导出.但是,如果加载了依赖DLL并且该DLL缺少其父级所需的函数,则显然会发生这种情况.
举个例子,我们有一个名为input.dll的库.DLL搜索顺序始终首先查看应用程序目录,最后查找PATH目录.过去,我们总是在与input.dll相同的目录中运行可执行文件.但是,Windows系统目录中有另一个input.dll(位于DLL搜索顺序的中间).所以当从java applet运行它时,如果我在applet中包含上面描述的代码,导致input.dll被加载,它将从系统目录加载input.dll.因为我们的代码期望input.dll中的某些函数不存在(因为它是一个不同的DLL),所以加载失败并显示有关缺少过程的错误消息.不是因为JNI函数导出错误,而是因为加载了错误的依赖DLL并且它没有