JNI UnsatisfiedLinkError 依赖库

Posted

技术标签:

【中文标题】JNI UnsatisfiedLinkError 依赖库【英文标题】:JNI UnsatisfiedLinkError dependent libraries 【发布时间】:2014-11-01 20:12:04 【问题描述】:

我有一个 JNI dll 以及一个我在使用 eclipse 的机器上创建的 jar 文件。

我正在尝试将其部署到另一台机器上,但无法通过异常

Exception in thread "main" java.lang.UnsatisfiedLinkError: C:\CcmAccess\CcmJNIBase.dll: Can't find dependent libraries
        at java.lang.ClassLoader$NativeLibrary.load(Native Meth
        at java.lang.ClassLoader.loadLibrary1(Unknown Source)
        at java.lang.ClassLoader.loadLibrary0(Unknown Source)
        at java.lang.ClassLoader.loadLibrary(Unknown Source)
        at java.lang.Runtime.loadLibrary0(Unknown Source)
        at java.lang.System.loadLibrary(Unknown Source)
        at com.sig.ccm.CcmBase.<clinit>(CcmBase.java:8)
        at ReadTimeDomain.setupSample(ReadTimeDomain.java:24)
        at ReadTimeDomain.main(ReadTimeDomain.java:97)

我有另一个程序打印出 java.library.path,我已经验证了这个 dll 所依赖的 dll 以及这个 dll 在 java.library.path 中。

我已经阅读了它们应该放在当前目录中的帖子,但这不起作用。

我已经阅读了它们应该放在 jre/bin 中的帖子,并且得到了相同的结果。

任何帮助将不胜感激。

编辑:

如果我从路径中取出所有内容并强制类路径只包含 jar 文件和“。”我收到消息

Exception in thread "main" java.lang.UnsatisfiedLinkError: no CcmJNIBase in java.library.path

当我将此 dll 的位置添加到路径 C:\CcmAccess 中时,我会收到完整的消息:

Exception in thread "main" java.lang.UnsatisfiedLinkError: C:\CcmAccess\CcmJNIBase.dll: Can't find dependent libraries

在这似乎工作的机器上,我所要做的就是将依赖的 dll 添加到我的类路径中。

【问题讨论】:

您是否在 java.library.path 中使用了绝对路径? 【参考方案1】:

仔细检查您的 java.library.path 值。 确保您使用的是绝对路径。 相对路径会让你认为你的 java.library.path 是正确的,而实际上它实际上是不正确的。

如果您要添加“。”在您的 java.library.path 中,然后您需要在执行代码时仔细检查“当前工作目录”。

如果您需要在 java.library.path 中使用相对路径,请确保在执行代码时该路径与“工作目录”相对。

【讨论】:

我只使用绝对路径。我在路径上明确命名了 JNI dll,并且在路径上命名了它所在的目录。 java.library.path 的最后一个元素是“.”。 JNI dll和native dll在同一个目录下。我已经尝试明确命名它们中的每一个,但这无济于事。仔细检查“当前工作目录”是什么意思? 如果消息是C:\CcmAccess\CcmJNIBase.dll:找不到依赖库。它是在寻找 CcmJNIBase 还是它所依赖的 dll? 它正在寻找 CCmJNIBase.dll。你在“其他机器”上有吗? 它是在另一台机器上创建的。在我试图部署的机器上,如果我要求 Windows 查找它找到的文件:C:\CcmAccess\CcmJNIBase.dll。在我的路径中,我有 C:\CcmAccess;C:\CcmAccess\CcmJNIBase.dll;.

以上是关于JNI UnsatisfiedLinkError 依赖库的主要内容,如果未能解决你的问题,请参考以下文章

如何修复 JNI 项目中的 UnsatisfiedLinkError(找不到依赖库)

JNI C++ DLL - 'UnsatisfiedLinkError: %1 不是有效的 Win32 应用程序'

JNI:为简单的 HelloWorld 程序获取 java.lang.UnsatisfiedLinkError

Java JNI 错误 java.lang.UnsatisfiedLinkError: xxxx()V

java.lang.UnsatisfiedLinkError:从JNI_OnLoad返回的JNI_ERR

[Java JNI] [Windows] [Visual Studio] [DLL] [UnsatisfiedLinkError]