在Java中加载DLL - Eclipse - JNI

时间:2010-03-29 03:43:51

标签: java eclipse java-native-interface

我正在尝试使用以下代码在java中加载dll     的System.loadLibrary( “MYDLL”);

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

但是当我跑步时,我得到 UnsatisifiedLinkerError 。谷歌搜索了一下后,我用了     System.load( “d:\ MYDLL.DLL”);

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

9 个答案:

答案 0 :(得分:8)

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

编辑: UnsatisfiedLinkError :如果Java虚拟机无法找到声明为native的方法的相应本机语言定义,则抛出此异常 - 您似乎正在使用不存在的JNI函数。 / p>

答案 1 :(得分:4)

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

答案 2 :(得分:3)

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

  1. JVM找不到你的DLL :在这种情况下,你的java库路径不正确(我怀疑)你应该把它设置为.并放置你的DLL在当前的工作目录中。
  2. JVM找不到您的DLL所依赖的DLL :如果您的DLL中有任何依赖库,它们被JVM搜索 NOT ,但是由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

  3. 希望有所帮助。

答案 3 :(得分:3)

您遇到的一个问题是: System.load( “d:\ MYDLL.DLL”); 应该 System.load( “d:\\ MYDLL.DLL”); 要么 System.load( “d:/mydll.dll”);

我在System.load上取得了更多成功,但是loadlibrary更适合多平台设计。 它为你找出了扩展名。

答案 4 :(得分:1)

把你的Almafa.dll放到C:/ Java / jre7 / lib或/ bin抱歉,我不记得了。完成后不再需要配置,只需说

即可

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

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

答案 5 :(得分:0)

@ alee-您可以复制并粘贴windows的system32文件夹中的dll文件,并尝试通过System.loadLibrary(“mydll”)调用库...我想它可能有效... < / p>

答案 6 :(得分:0)

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");
    }
}

答案 7 :(得分:0)

将项目中的库路径作为本机库位置,似乎已经解决了。

答案 8 :(得分:0)

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

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

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