繁体   English   中英

在Java中加载DLL - Eclipse - JNI

[英]Loading DLL in Java - Eclipse - JNI

我试图使用以下代码System.loadLibrary(“mydll”)在java中加载一个DLL;

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

但是当我运行时,我得到UnsatisifiedLinkerError 谷歌搜索后,我使用System.load(“D:\\ mydll.dll”);

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

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

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

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

你遇到的一个问题是:System.load(“D:\\ mydll.dll”); 应该是System.load(“D:\\\\ mydll.dll”); 或System.load(“D:/mydll.dll”);

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

使用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

希望有所帮助。

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

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

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

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

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

另请参见: Java中的System.load()和System.loadLibrary之间的区别

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM