UnsatisfiedLinkError:找不到指定的过程
我正在用C ++编写一些JNI代码,以便从Windows XP上的applet调用它。我已经能够成功运行applet并加载和调用JNI库,甚至可以在其他DLL中调用它。我通过设置PATH系统环境变量来使其工作,以包括我所有DLL所在的目录。
因此,问题在于,我添加了另一个使用新的外部DLL的调用,并且突然在加载库时引发UnsatisfiedLinkError。消息为:"找不到指定的过程"。缺少依赖的DLL似乎不是问题,因为我可以删除依赖的DLL并获得有关丢失的依赖DLL的其他消息。从我在网上可以找到的信息来看,该消息似乎意味着DLL中缺少本机Java函数实现,但是奇怪的是,如果没有这些额外的代码,它就可以很好地工作。
有谁知道这可能是什么原因?什么样的事情可以为UnsatisifedLinkError提供"找不到指定的过程"消息?
解决方案
通常,链接到其他库时,需要链接到相关的.lib文件。听起来我们没有引用所需的所有lib文件。检查未链接的内容,并确保将其库添加到链接器的列表中。
DLL是使用C ++(而不是C)构建的。除非我们注意对程序进行外部检查,否则这可能是一个原因。
尝试从DLL导出所有功能。如果列表中包含功能,那么我们就很好。
我们是否使用标准的JNI过程创建了新的外部DLL?即使用javah等?如果是这样,那么我不确定是哪里出了问题。
如果不是,则我们尝试调用的过程尚未导出(如anjanb所述)。我知道两种导出函数的方法:单独的导出列表和使用__declspec(dllexport)标记特定的函数。
从C应用程序无法访问C ++ DLL中的变量具有有关DLL主题的更多信息。
我解决了这个问题。这真是个笨蛋。针对UnsatisfiedLinkError的消息"找不到指定的过程"指示在根dll或者从属dll中找不到函数。在JNI情况下,此问题最可能的原因是本机JNI函数未正确导出。但是,如果加载了依赖的DLL并且该DLL缺少其父级所需的功能,则可能会发生这种情况。
举例来说,我们有一个名为input.dll的库。 DLL的搜索顺序是始终首先在应用程序目录中查找,最后在PATH目录中查找。过去,我们总是在与input.dll相同的目录中运行可执行文件。但是,Windows系统目录(位于DLL搜索顺序的中间)中还有另一个input.dll。因此,当从Java applet运行此代码时,如果我在applet中包含上述代码,从而导致input.dll被加载,它将从系统目录中加载input.dll。因为我们的代码期望input.dll中的某些功能不存在(因为它是不同的DLL),所以加载失败并显示有关缺少过程的错误消息。不是因为JNI函数导出错误,而是因为加载了错误的依赖DLL,并且其中没有预期的功能。
在调试模式下编译c ++代码。然后插入DebugBreak();我们想在哪里开始调试的语句。运行Java代码。遇到DebugBreak()语句时,将弹出一个带有Debug按钮的弹出窗口。点击它。 Dev Studio将以程序以机器代码打开。与调试器一起执行两次,我们应该可以跨过源代码。