我正在用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导出所有函数。如果列表包含您的功能,那么您就是好的。

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

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

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

无法从C ++ DLL中访问变量一个C应用程序有更多关于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 添加到路径变量
  3. 执行这些步骤后,您的应用程序可以找到jni过程名称并以正确的方式链接到JNI.dll。所以,我希望你不要再次得到这个缺失的程序错误。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top