java - 不满意链接错误 : The specified procedure could not be found

标签 java java-native-interface

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

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

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

最佳答案

我发现了问题。这是一个愚蠢的。 UnsatisfiedLinkError 的消息“找不到指定的过程”表示找不到根 dll 或 从属 dll 中的函数。在 JNI 情况下,最可能的原因是 native 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,并且其中没有预期的函数。

关于java - 不满意链接错误 : The specified procedure could not be found,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/159846/

相关文章:

java - 查询返回多条记录

Java 正则表达式匹配特殊字符,除非它位于括号内

java - java 中的 opencv 使用 MAT 而不是 vector 作为标签

java - 如何在 Android 应用程序中打包 native 库?

java - 直接字节缓冲区

java - spring 和 MessagesSource 空指针异常

java - Spark 在 UDF Java 中获取 WrappedArray<WrappedArray<Double>> 的值

java - 了解 JNI 参数的安全访问

java - 正则表达式提取组中的子字符串

java - 有没有办法检查 jobject 是本地引用还是全局引用?