UnsatisfiedLinkError:找不到指定的过程

我正在用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并且它没有预期的函数。

DLL有可能是使用C ++构建的(而不是C语言)。 除非你注意做一个关于程序的外部,这是一个可能的原因。

尝试从DLL导出所有函数。 如果列表包含您的function,那么您就是好的。

通常,在链接到其他库时,您需要链接到相关的.lib文件。 听起来您没有引用所需的所有lib文件。 检查未链接的内容,并确保将其lib添加到链接器列表中。

您是否使用标准JNI过程创建了新的外部DLL? 即,使用javah等等? 如果是这样,那么我不确定是什么问题。

如果没有,那么您尝试调用的过程尚未导出(如anjanb所述)。 我知道两种导出函数的方法:单独的导出列表和使用__declspec(dllexport)标记特定函数。

无法从C应用程序访问C ++ DLL中的变量有更多关于DLL主题的信息。

在调试模式下编译c ++代码。 然后插入DebugBreak(); 您要开始调试的语句。 运行java代码。 遇到DebugBreak()语句时,会弹出一个带有Debug按钮的弹出窗口。 点击它。 Dev Studio将使用您的程序在机器代码中打开。 使用调试器两次跳过,您应该可以跳过源代码。

如果您已经在JNI手册和示例中完成了所有编程问题,但仍然遇到相同的缺失过程错误,则问题可能在您的路径变量上。 执行以下步骤并再次运行:

  1. 确保将JAVA_HOME变量设置为JDK文件夹(而不是JRE,因为JRE不包含jni标头)示例: 在环境变量设置面板中定义var:JAVA_HOME val:C:\ Program Files \ Java \ jdk1.7.0_11
  2. %JAVA_HOME%\ bin添加到路径变量中

执行这些步骤后,您的应用程序可以找到jni过程名称并以正确的方式链接到JNI.dll。 所以,我希望你不要再次得到这个丢失的程序错误。