【问题标题】:Loading DLL in Java - Eclipse - JNI在 Java 中加载 DLL - Eclipse - JNI
【发布时间】:2011-02-01 21:41:18
【问题描述】:

我正在尝试使用以下代码在 java 中加载 dll System.loadLibrary("mydll");

项目位于 D:\development\project\ 中,我已将 dll 放在 D: 中。然后我在eclipse配置中给出了以下VM参数 -Djava.library.path=D:/

但是当我运行时,我得到 UnsatisifiedLinkerError。谷歌搜索了一下后,我用 System.load("D:\mydll.dll");

但又遇到同样的问题,有人可以帮忙吗?

【问题讨论】:

  • 我使用此代码 System.getProperty("java.class.path") 测试了我的类路径,并将 dll 放在该特定路径上。之后,我收到错误“找不到依赖库”。我如何检查它正在询问哪些库:S。我正在使用一些第三方 Dll。

标签: java eclipse java-native-interface


【解决方案1】:

在库路径中指定 DLL 文件名的地方,省略它。此外,您的 System.loadLibrary 调用应该只是“mydll”。我可以告诉您(根据经验),如果您将 DLL 放在 Eclipse 中项目的根目录中(即 D:\Eclipse Workspace\Proj),它应该工作。任何进一步的链接器错误都可能来自于查找其他 DLL 的依赖性问题。例外是一样的。使用 Dependency Walker (http://www.dependencywalker.com/) 之类的工具来查看您的 DLL 是否依赖于系统库路径之外的任何其他内容。

编辑:UnsatisfiedLinkError:如果 Java 虚拟机找不到声明为本地的方法的适当本地语言定义,则抛出 - 似乎您正在使用不存在的 JNI 函数。

【讨论】:

    【解决方案2】:

    您遇到的一个问题是: System.load("D:\mydll.dll"); 应该 System.load("D:\\mydll.dll"); 要么 System.load("D:/mydll.dll");

    我在 System.load 方面取得了更大的成功,但 loadlibrary 更适合多平台。 它会为您计算出扩展名。

    【讨论】:

      【解决方案3】:

      查看如何正确设置本机依赖项here。此外,请确保使用正确的 JVM:在我的情况下,找不到 DLL,因为它是 32 位 DLL,但我使用的是 x64 JVM!

      【讨论】:

        【解决方案4】:

        使用System.loadLibrary("mydll") 可以正常工作,您也可以使用那个。如果您使用了javah,并且您认为您的 DLL 一切正常,则有两种可能:

        1. JVM 没有找到您的 DLL:在这种情况下,您的 java 库路径不正确(我怀疑),您应该将其设置为 . 并将您的 DLL 放在当前工作目录中.
        2. JVM 没有找到您的 DLL 所依赖的 DLL:如果您的 DLL 中有任何依赖库,则它们不会由 JVM 搜索,而是由 Windows 搜索本身。并且 Windows 不知道 java.library.path,因此它会在系统 PATH 变量中查找这些变量。如果有可能,您可以在启动 JVM 之前将系统 PATH 变量设置为 DLL 的位置,一切都会好起来的。或者您可以像这样使用 JVM 加载所有 DLL

          System.loadLibrary("dll_1");
          System.loadLibrary("dll_2");
          System.loadLibrary("dll_3");

          其中dll_3.dll 依赖于dll_2.dll,后者依赖于dll_1.dll

        希望对您有所帮助。

        【讨论】:

        • 看起来,在 linux 下,这个概念在某种程度上不起作用,有人知道为什么吗?
        • 它应该也适用于我在 Linux 下。您要加载哪种库?
        【解决方案5】:

        System.loadLibrary 从 JVM 路径(JDK bin 路径)加载 DLL。

        如果要加载带有路径的显式文件,请使用 System.load()

        另见:Difference between System.load() and System.loadLibrary in Java

        public class MyClass
        {
            static 
            {
                System.load("MyJNI.dll");
            }
        }
        

        【讨论】:

          【解决方案6】:

          将您的 Almafa.dll 放入 C:/Java/jre7/lib 或 /bin 抱歉,我记不清了。在您完成不需要更多配置后,只需说

          static{ System.LoadLibrary("Almafa"); }

          在你想加载它的类中。它仅适用于 Java 项目,在 Android 之类的项目中,您需要使用 JNI。我现在发布了三天不睡觉的结果:)

          【讨论】:

            【解决方案7】:

            @alee-您可以复制并粘贴 Windows 的 system32 文件夹中的 dll 文件,然后尝试通过 System.loadLibrary("mydll") 调用库...我想它可能会工作...

            【讨论】:

              【解决方案8】:

              把你项目中的库路径作为原生库位置,好像解决了。

              【讨论】:

                【解决方案9】:

                我通过以下方法解决了我的错误:

                   static {
                    try {
                        System.loadLibrary("myDLL");
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
                

                而不是使用System.load("myDLL.dll")

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2013-03-16
                  • 1970-01-01
                  • 2017-09-12
                  • 1970-01-01
                  相关资源
                  最近更新 更多