Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java.library.path中的java.lang.UnsatifiedLink错误号******.dll_Java_Dll_Java Native Interface_Web Applications - Fatal编程技术网

java.library.path中的java.lang.UnsatifiedLink错误号******.dll

java.library.path中的java.lang.UnsatifiedLink错误号******.dll,java,dll,java-native-interface,web-applications,Java,Dll,Java Native Interface,Web Applications,如何在web应用程序中加载自定义dll文件?我尝试了以下方法: 复制了system32文件夹中所有必需的DLL,并尝试在Servlet构造函数System.loadLibrary中加载其中一个DLL 已将所需DLL复制到tomcat_home/shared/lib和tomcat_home/common/lib中 所有这些DLL都位于WEB应用程序的WEB-INF/lib中为了让System.loadLibrary、Windows上的库正常工作,DLL必须位于路径上的某个目录中,或者位于java.

如何在web应用程序中加载自定义dll文件?我尝试了以下方法:

复制了system32文件夹中所有必需的DLL,并尝试在Servlet构造函数System.loadLibrary中加载其中一个DLL 已将所需DLL复制到tomcat_home/shared/lib和tomcat_home/common/lib中 所有这些DLL都位于WEB应用程序的WEB-INF/lib中

为了让System.loadLibrary、Windows上的库正常工作,DLL必须位于路径上的某个目录中,或者位于java.library.PATH系统属性中列出的某个路径中,这样您就可以像java一样启动java-Djava.library.PATH=/PATH/to/dir

此外,对于loadLibrary,您可以指定库的基本名称,但末尾不带.dll。因此,对于/path/to/something.dll,您只需使用System.loadLibrarysomething

您还需要查看得到的确切的未满意链接错误。如果它说:

Exception in thread "main" java.lang.UnsatisfiedLinkError: no foo in java.library.path
Exception in thread "main" java.lang.UnsatisfiedLinkError: com.example.program.ClassName.foo()V
然后在您的路径或java.library.PATH中找不到foo库foo.dll。如果它说:

Exception in thread "main" java.lang.UnsatisfiedLinkError: no foo in java.library.path
Exception in thread "main" java.lang.UnsatisfiedLinkError: com.example.program.ClassName.foo()V
然后,库本身就出了问题,因为Java无法将应用程序中的本机Java函数映射到其实际的本机对应函数

首先,我会在System.loadLibrary调用中做一些日志记录,看看它是否正确执行。如果它抛出异常或不在实际执行的代码路径中,那么您将始终得到上面解释的后一种类型的UnsatifiedLinkError

作为旁注,大多数人使用本机方法将其loadLibrary调用放入类中的静态初始值设定项块中,以确保始终只执行一次:

class Foo {

    static {
        System.loadLibrary('foo');
    }

    public Foo() {
    }

}

对于那些正在寻找java.lang.UnsatifiedLinkError的人:java.library.path中没有pdf_java

我也面临着同样的例外;我尝试了一切,重要的是:

pdf lib.jar的正确版本在我的例子中,jar保存在服务器运行时的版本是错误的 创建一个文件夹并将pdflib jar保存在其中,然后将该文件夹添加到PATH变量中
它与tomcat 6一起工作。

可怜的我!花了一整天的时间在这件事上如果有人复制这件事,就把它写在这里

我试图按照Adam的建议加载,但随后发现AMD64 vs IA 32异常。如果在任何情况下按照Adam的建议工作后,不怀疑最佳选择演练,请尝试使用最新jre的64位版本。确保您的jre和JDK是64位的,并且您已将其正确添加到类路径中

我的工作示例如下:

您可以使用System.load提供所需的绝对路径,而不是相应操作系统的标准库文件夹中的文件

如果您想要已有的本机应用程序,请使用。如果你想提供你自己的,你可能更好的负载


您还应该能够在java.library.path设置正确的情况下使用loadLibrary。请参阅显示OpenJDK检查的两条路径的实现源代码。Adam Batkin的原始答案将引导您找到解决方案,但如果您在不重新启动web容器的情况下重新部署webapp,您将遇到以下错误:

java.lang.UnsatisfiedLinkError: Native Library "foo" already loaded in another classloader
   at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1715)
   at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1646)
   at java.lang.Runtime.load0(Runtime.java:787)
   at java.lang.System.load(System.java:1022)
这是因为最初加载DLL的类加载器仍然引用此DLL。但是,您的webapp现在使用一个新的类加载器运行,并且由于同一个JVM正在运行,并且JVM不允许对同一个DLL进行2次引用,因此您无法重新加载它。因此,您的Web应用程序无法访问现有的DLL,也无法加载新的DLL。所以你被卡住了

概述了重新加载的webapp为何在新的隔离类加载器中运行,以及如何在非常高的级别上克服此限制

解决方案是稍微扩展Adam Batkin的解决方案:

   package awesome;

   public class Foo {

        static {
            System.loadLibrary('foo');
        }

        // required to work with JDK 6 and JDK 7
        public static void main(String[] args) {
        }

    }
然后将一个只包含这个编译类的jar放入TOMCAT_HOME/lib文件夹

现在,在您的webapp中,您只需强制Tomcat引用此类即可,操作如下:

  Class.forName("awesome.Foo");
现在,您的DLL应该加载到公共类加载器中,即使在重新部署之后,也可以从您的webapp引用

有道理吗


可以在google代码中找到工作参考副本。

如果您需要加载与当前目录类似的某个目录相关的文件,这里有一个简单的解决方案:

File f;

if (System.getProperty("sun.arch.data.model").equals("32")) {
    // 32-bit JVM
    f = new File("mylibfile32.so");
} else {
    // 64-bit JVM
    f = new File("mylibfile64.so");
}
System.load(f.getAbsolutePath());

如果问题是System.loadLibrary找不到有问题的DLL,Java的错误消息强化了一个常见的误解,即系统属性Java.library.path就是答案。如果将系统属性java.library.path设置为DLL所在的目录,则system.loadLibrary确实会找到DLL。但是,如果DLL反过来又依赖于其他DLL(通常是这样),那么java.library.path就无能为力,因为依赖DLL的加载完全由操作系统管理,而操作系统对java.library.path一无所知。因此,绕过java几乎总是更好的。 在启动JVM之前,只需将DLL的目录添加到LD_library_path Linux、DYLD_library_path MacOS或path Windows


注意:我使用的术语DLL是DLL或共享库的一般含义。

在运行时更改“java.library.path”变量是不够的,因为JVM只读取一次。您必须将其重置为:

System.setProperty("java.library.path", path);
//set sys_paths to null
final Field sysPathsField = ClassLoader.class.getDeclaredField("sys_paths");
sysPathsField.setAccessible(true);
sysPathsField.set(null, null);

请看:。

对于windows,我发现当我将fillesjd2xsx.dll调用&ftd2x.dll加载到windowws/system32文件夹时,问题就解决了。然后,我的较新fd2xx.dll与参数有关,这就是为什么我必须加载此dll的较旧版本的原因。我以后得把这个运出去


注意:jd2xsx.dll调用ftd2x.dll,因此仅设置jd2xx.dll的路径可能不起作用。

我使用的是Mac OS X Yosemite和Netbeans 8.02,我遇到了相同的错误,我找到的简单解决方案如上所述,这在项目中需要包含本机库时非常有用。因此,请为Netbeans执行下一步操作:

1.- Right click on the Project
2.- Properties
3.- Click on RUN
4.- VM Options: java -Djava.library.path="your_path"
5.- for example in my case: java -Djava.library.path=</Users/Lexynux/NetBeansProjects/NAO/libs>
6.- Ok
我希望它能对某人有用。 我找到解决方案的链接如下:

我也遇到了同样的问题,错误是由于对dll进行了重命名。 库名称也可能写入dll中的某个位置。 当我将其原始名称放回原处时,我可以使用System.loadLibrary加载

如果您认为已将本机库的路径添加到%path%,请尝试使用以下方法进行测试:

System.out.println(System.getProperty("java.library.path"))
它应该显示您的dll是否在%PATH%上

重新启动IDE Idea,在我设置env变量并将其添加到%PATH%后,IDE Idea似乎对我有效
只需在windows中的命令行上编写java-XshowSettings:properties,然后将所有文件粘贴到java.library.path显示的路径中即可。首先,您需要确保本机库的目录位于java.library.path上。看看怎么做。然后,您可以在不使用扩展名的情况下调用System.LoadLibraryNativelLibraryName-确保在库的名称中不包含文件扩展名。

将所有DLL放入System32并使用System.LoadLibrary。我之前在做System.loadLibrarysomething.dll。为什么不能从WEB-INF加载所有DLL?我猜默认情况下它会加载所有jar。如何从WEB-INF直接加载这些dll而不是System32/在java.library.path+1中指定它们作为“使用bla代替bla.dll加载库”备注-当您不知道自己做错了什么时非常有用。在我的系统Linux和java7上,我需要一个lib前缀。所以System.loadLibraryfoo需要libfoo.So.谢谢。当我更新windows的路径,使其包含包含*.so文件的文件夹时,它对我起了作用。我可以发誓OSX需要blah.jnilib和Linux libblah.so。两个小时后,经过多次尝试,我得出结论,OSX也需要lib prefixthank。使用load实际上更简单、更直观。无论我做了什么,都无法使loadLibrary工作…此解决方案不适用于加载其本机库的库。嗨,Alex,我这里有一个问题,如果库路径在这一行的路径中包含一些空格,是否有任何问题VM选项:java-Djava.library.path=your_pathMmm我去年没有使用java,但由于可能出现冲突,我建议避免在文件路径中添加空格。这个答案对于应用程序服务器和应该有自己的问题,因为这是浪费在这个问题上。