JNA UnsatisfiedLinkError,但设置了jna.library.path

时间:2011-07-26 00:02:55

标签: jna

我正在使用以下代码在JNA中加载dll(不相关的代码被遗漏):

    public class JNAMain {
       public interface PointShapeBuffer extends Library { ... }

       public static void main(String[] args){
          System.setProperty("jna.library.path", "c:\\jnadll");
          System.setProperty("java.library.path", "c:\\jnadll");

          PointShapeBuffer jna = (PointShapeBuffer) Native.loadLibrary("FileGDBAPI", PointShapeBuffer.class);
       }
    }

我收到以下错误:

Exception in thread "main" java.lang.UnsatisfiedLinkError: Unable to load library 'FileGDBAPI': The specified module could not be found.

我也尝试过设置VM args。任何建议都会很棒。

编辑:作为参考,我使用的是一个公开的库here(需要注册)。

6 个答案:

答案 0 :(得分:8)

根据我的经验,在64位Win7上从64位jvm调用32位本机dll时,您通常会看到此错误。 Win7在64位和32位应用程序中的工作方式不同。

在64位Win7上,您可以调用本机32位dll中的函数,但需要使用32位JVM。

  1. 下载并安装32位Java运行时环境(JRE)。您可以在同一台机器上安装32位和64位jvm,只需确保它们安装在单独的目录中即可。
  2. 确保在执行程序时运行32位JRE而不是默认的64位JVM。 A)将您的CLASSPATH和JAVA_HOME环境变量更改为指向32位jvm,或编写脚本以设置CLASSPATH和JAVA_HOME并启动您的应用程序。
  3. 原因是32位dll与64位应用程序不兼容,64位Win7使用32位仿真器运行32位应用程序。虽然Windows库可能被称为xxxx32.dll(例如user32.dll),但64位Win7上的System32文件夹中的库是64位库,而不是32位,而SysWOW64中的库是32位库,令人困惑吧?!?

    您也可以将库放在32位系统文件夹(SysWOW64)中,并在32位JVM中进行JNI调用。

    查看以下链接,了解64位Win7如何处理库的完整解释;

    http://www.samlogic.net/articles/32-64-bit-windows-folder-x86-syswow64.htm

    如果你真的想帮助自己入睡,那就试着开始吧;)

    http://msdn.microsoft.com/en-us/windows/hardware/gg463051.aspx

答案 1 :(得分:5)

改变你的:

Native.loadLibrary("FileGDBAPI", PointShapeBuffer.class);

为:

Native.loadLibrary("C:\\jnadll\\FileGDBAPI.dll", PointShapeBuffer.class);

如果你深入研究jna源代码,你会发现NativeLibrary类中有一个很好的小钩子:

    /** Use standard library search paths to find the library. */
    private static String findLibraryPath(String libName, List searchPath) {
        //
        // If a full path to the library was specified, don't search for it
        //
        if (new File(libName).isAbsolute()) {
            return libName;
        }
        ...

因此,如果您只是通过绝对路径而不使用searchPath,它将会捕获。这就是为什么你不必担心jna.library.lib。

答案 2 :(得分:2)

您需要指定包含DLL的文件夹,而不是DLL的实际路径。

e.g。对于baz.dll c:\foo\bar\baz.dll,路径应设置为c:\\foo\\bar。 (注意如果你使用退格键,你必须用反斜杠转义它们

答案 3 :(得分:1)

您可能希望使用jna.jar和platform.jar下载最新版本,并将其包含在内。不需要设置路径。

答案 4 :(得分:0)

就像在某些注释中已经提到的那样:检查您对DLL /库的依赖性。最好的工具是Dependency Walker(http://www.dependencywalker.com/)。只有满足您所有的依赖关系,jna才能找到您的DLL。...花了我很长时间才能弄清楚这一点

答案 5 :(得分:-1)

可能是因为lebweb套件中存在混淆。我不确定,但那必须是现在你可以做一件事尝试这个。

$ dpkg -l | grep -i jna

尝试此命令,如果你得到这个输出

ii  libjna-java  3.2.7-4 Dynamic access of native libraries from Java without JNI

或任何其他输出然后你需要从系统中删除那个jna,因为如果程序本身有jna jar,那么就不需要系统jna了。所以做这样的事情。

sudo apt-get autoremove libjna-java

并尝试重新启动该应用程序。它将运行并且没有运行然后尝试安装新版本的 libwebkit-gtk

希望这会有所帮助。这帮助了我。