首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JNA UnsatisfiedLinkError,但设置了jna.library.path

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

Stack Overflow用户
提问于 2011-07-26 08:02:55
回答 6查看 29.5K关注 0票数 9

我使用以下代码在JNA中加载dll (省略了不相关的代码):

代码语言:javascript
复制
    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);
       }
    }

我得到了以下错误:

代码语言:javascript
复制
Exception in thread "main" java.lang.UnsatisfiedLinkError: Unable to load library 'FileGDBAPI': The specified module could not be found.

我还尝试设置了VM参数。任何建议都是很棒的。

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

EN

回答 6

Stack Overflow用户

发布于 2012-04-23 21:55:48

根据我的经验,从64位Win7上的64位jvm调用32位原生dll时,通常会出现此错误。Win7对64位和32位应用程序的工作方式不同。

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

  1. 下载并安装32位Java运行时环境(JRE)。你可以在同一台机器上安装32位和64位的jvm,只要确保它们安装在不同的directories.
  2. Ensure中就可以了。当你执行你的程序时,运行32位的JRE而不是默认的64位JVM。A)更改CLASSPATH和JAVA_HOME环境变量以指向32位jvm,或者编写脚本来设置CLASSPATH和JAVA_HOME并启动应用程序。

原因是32位动态链接库与64位应用程序不兼容,而64位Win7使用32位仿真器来运行32位应用程序。虽然Windows库可能被称为xxxx32.dll (例如user32.dll),但64位Win7上的System32文件夹中的库是64位库,而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

票数 8
EN

Stack Overflow用户

发布于 2013-04-19 05:55:32

更改您的:

代码语言:javascript
复制
Native.loadLibrary("FileGDBAPI", PointShapeBuffer.class);

至:

代码语言:javascript
复制
Native.loadLibrary("C:\\jnadll\\FileGDBAPI.dll", PointShapeBuffer.class);

如果您深入研究了jna源代码,就会在NativeLibrary类中找到一个很好的小钩子:

代码语言:javascript
复制
    /** 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的原因。

票数 6
EN

Stack Overflow用户

发布于 2011-07-26 09:36:08

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

例如,对于c:\foo\bar\baz.dll上的baz.dll,路径应设置为c:\\foo\\bar。(请注意,在Java中,如果使用退格,则必须使用反斜杠对其进行转义)

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6823870

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档