13

我正在用 C++ 编写一些 JNI 代码,以便从 Windows XP 上的小程序中调用。我已经能够成功地运行小程序并加载和调用 JNI 库,甚至可以让它调用其他 DLL 中的函数。我通过设置 PATH 系统环境变量来包含我所有的 DLL 所在的目录来实现这一点。

所以,问题是我添加了另一个使用新外部 DLL 的调用,并且在加载库时突然抛出 UnsatisfiedLinkError。消息是:“找不到指定的过程”。这似乎不是缺少依赖 DLL 的问题,因为我可以删除依赖 DLL 并获得有关缺少依赖 DLL 的不同消息。从我在网上找到的信息来看,这条消息似乎意味着 DLL 中缺少本机 Java 函数实现,但奇怪的是,如果没有这些额外的代码,它可以正常工作。

有谁知道这可能是什么原因造成的?对于 UnsatisifedLinkError,什么样的事情可以给出“找不到指定的过程”消息?

4

6 回答 6

18

我解决了这个问题。这真是太棒了。UnsatisfiedLinkError 的消息“找不到指定的过程”表示找不到根 dll 或依赖 dll中的函数。在 JNI 情况下,最可能的原因是未正确导出本机 JNI 函数。但是,如果加载了依赖 DLL 并且该 DLL 缺少其父级所需的函数,则显然会发生这种情况。

例如,我们有一个名为 input.dll 的库。DLL 搜索顺序是始终首先查找应用程序目录,最后查找 PATH 目录。过去,我们总是从与 input.dll 相同的目录中运行可执行文件。但是,windows系统目录下还有另一个input.dll(在DLL搜索顺序的中间)。因此,当从 java 小程序运行它时,如果我在小程序中包含上述代码,这会导致加载 input.dll,它会从系统目录加载 input.dll。因为我们的代码需要 input.dll 中不存在的某些函数(因为它是不同的 DLL),所以加载失败并显示有关缺少过程的错误消息。不是因为 JNI 函数导出错误,而是因为加载了错误的依赖 DLL 而它没有

于 2008-10-07T21:47:12.510 回答
2

DLL 有可能是使用 C++(而不是 C)构建的。除非您注意对程序进行 extern,否则这是可能的原因之一。

尝试从 DLL 中导出所有函数。如果列表包含您的功能,那么您很好。

于 2008-10-01T23:10:00.813 回答
0

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

于 2008-10-01T21:31:13.033 回答
0

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

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

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

于 2008-10-03T01:03:29.147 回答
0

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

于 2009-10-20T12:30:17.073 回答
0

如果您在 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。所以,我希望你不会再遇到这个丢失的程序错误。

于 2015-01-15T12:21:45.380 回答