java.lang.UnsatisfiedLinkError中没有***** DLL中的java.l

2019-07-17 14:16发布

我如何可以加载在我的web应用程序自定义的dll文件? 我尝试以下方法,但它的失败。

  • 复制所有需要的DLL system32文件夹,并试图加载它们中的一个Servlet构造函数System.loadLibrary
  • 在复制所需的DLL tomcat_home/shared/libtomcat_home/common/lib
  • 所有这些DLL文件在WEB-INF/lib的web应用的

Answer 1:

为了让System.loadLibrary()工作,库(在Windows上,一个DLL)必须在某个目录里你的PATH 在上市的道路上java.library.path系统属性(这样你就可以启动Java一样java -Djava.library.path=/path/to/dir )。

此外,对于loadLibrary()您指定库的基本名称,没有.dll结尾。 因此,对于/path/to/something.dll ,你只需要使用System.loadLibrary("something")

您还需要看看确切UnsatisfiedLinkError你得到。 如果说是这样的:

Exception in thread "main" java.lang.UnsatisfiedLinkError: no foo in java.library.path

那么就无法找到您foo的库(foo.dll) PATHjava.library.path 。 如果说是这样的:

Exception in thread "main" java.lang.UnsatisfiedLinkError: com.example.program.ClassName.foo()V

那么什么是错与库本身在某种意义上说,Java是不能够在你的应用程序的本地Java函数映射到其实际的天然对应。

首先,我会放一些记录在你System.loadLibrary()调用,看看是否能正确执行。 如果它抛出一个异常或无法在实际执行的代码路径,那么你总是会得到后一种类型的UnsatisfiedLinkError如上所述。

作为一个旁注,大多数人把自己loadLibrary()调用到一个静态初始化块与本地方法,该类以确保它始终是执行一次:

class Foo {

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

    public Foo() {
    }

}


Answer 2:

因为它是由JVM只读一次,在运行时更改“的java.library.path”变量是不够的。 你必须将其复位,如:

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

请随便战利品在: 在运行时更改的Java库路径 。



Answer 3:

原来答案由亚当Batkin会带你到一个解决方案,但如果你重新部署你的web应用(无需重新启动Web容器),你应该遇到以下错误:

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。 然而,你的web应用,现在一个新的类加载器运行,因为在同一个JVM运行和JVM不会允许2个引用同一个DLL,则无法重新装入 。 因此,你的web应用不能访问现有的DLL,不能加载一个新的。 所以....你就完蛋了。

Tomcat的类加载器的文件概述了为什么你的web应用重装上阵在一个新的独立的ClassLoader,以及如何可以解决此限制(在一个非常高的水平)运行。

解决的办法是延长亚当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) {
        }

    }

然后将含有此JUST编译的类进TOMCAT_HOME / lib文件夹一个罐子。

现在,你的web应用中,你只需要强制Tomcat来引用这个类,它可以简单地做,因为这:

  Class.forName("awesome.Foo");

现在你的DLL应该在公共类加载器加载,并且可以从你的web应用,甚至重新调配后,被引用。

合理?

一个工作参考副本可以在谷歌代码,发现静态的dll引导程序 。



Answer 4:

您可以使用System.load()提供的绝对路径这是你想要的东西,而不是在标准库文件夹中的文件进行相应的操作系统。

如果你想已经存在的本地应用程序,使用System.loadLibrary(String filename) 。 如果你要提供你自己的,你很可能与负载更好的()。

你也应该能够使用loadLibraryjava.library.path正确设置。 见ClassLoader.java用于示出被检查两个路径执行源(OpenJDK的)



Answer 5:

在该问题是的System.loadLibrary无法找到有问题的DLL的情况下,一个常见的误解(通过Java的错误消息钢筋)是系统属性的java.library.path就是答案。 如果您设置系统属性的java.library.path到您的DLL所在的目录,然后将的System.loadLibrary确实找到你的DLL。 但是,如果你反过来DLL依赖于其他DLL,这是常有的情况下,那么的java.library.path不能帮助,因为依赖DLL加载是由操作系统,它什么都不知道java.library的完全管理。路径。 因此,它几乎总是更好地绕过的java.library.path白白LD_LIBRARY_PATH(Linux)上,DYLD_LIBRARY_PATH(MacOS的),或路径(Windows)中启动JVM之前添加DLL的目录。

(注:我使用的DLL或共享库的一般意义上的术语“DLL”)。



Answer 6:

如果您需要加载一个文件,该文件是相对于某些目录中你已经是(像在当前目录),这里是一个简单的解决方案:

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());


Answer 7:

对于那些谁正在寻找java.lang.UnsatisfiedLinkError: no pdf_java in java.library.path

我正面临同样的异常; 我什么都试过,并使其发挥作用是重要的事情:

  1. PDF lib.jar的正确版本(在我来说,这是错误的版本罐子存放在服务器运行时)
  2. 做一个文件夹,并保持的PDFlib罐子中,并在PATH变量中添加的文件夹

它的工作和Tomcat 6。



Answer 8:

可怜的我 ! 花了整整一天的背后,如果任何机构复制这个问题this.Writing下来这里。

我试图加载亚当建议,但随后得到了与AMD64在任何情况下按照亚当(毫无疑问的最佳新秀)演练工作后陷入VS IA 32 exception.If,尝试有最新jre.Make的64位版本肯定你的JRE和JDK是64位的,你已经正确地把它添加到你的classpath。

我的工作示例放在这里: unstatisfied链接错误



Answer 9:

  1. 如果你认为你添加的本地库的路径%PATH%,测试自己一个更多的时间:

    的System.out.println(System.getProperty( “的java.library.path”))

它实际上应该告诉你,如果你的DLL是%PATH%

  1. 不要重新启动IDE理念,是的,它似乎为我工作我将它添加到%PATH%设置环境变量后


Answer 10:

对于windows我发现,当我装的FILLES(jd2xsx.dll电话和ftd2xx.dll)到windowws / system32文件夹下该解决的问题。 然后我就与具有这就是为什么我必须加载这个DLL的旧版本参数做我的新fd2xx.dll的问题。 我必须在以后FERRIT了这一点。

注:jd2xsx.dll调用ftd2xx.dll所以只设置了jd2xx.dll可能无法正常工作的路径。



Answer 11:

我使用的是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

我希望它可以成为有用的人。 在那里我找到了解决办法的链接是在这里: 的java.library.path -它是什么以及如何使用



Answer 12:

我有同样的问题,该DLL的重命名错误所致。 这可能发生的是,库名称也写在DLL中的某个地方。 当我放回原来的名字我可以使用加载System.loadLibrary



Answer 13:

This is My java.library.path:

 java.library.path = C:\Program Files\Java\jdk1.7.0_51\bin
     C:\WINDOWS\Sun\Java\bin
     C:\WINDOWS\system32
     C:\WINDOWS
     C:\WINDOWS\system32
     C:\Program Files\I.R.I.S. SA\iDRS_15_2_for_Win64_15_2_11_1717\lib\idrskr
.lib
     C:\Program Files\I.R.I.S. SA\iDRS_15_2_for_Win64_15_2_11_1717\bin\iDRMSG
idgeDll.dll
     C:\Program Files\I.R.I.S. SA\iDRS_15_2_for_Win64_15_2_11_1717\bin\iDRMSG
aderDll.dll
     C:\Program Files\Java\jdk1.7.0_51\bin
     C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\include
     C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\lib
     C:\WINDOWS\System32\Wbem
     C:\WINDOWS\System32\WindowsPowerShell\v1.0
     C:\Program Files (x86)\Microsoft SQL Server\100\Tools\Binn\
     C:\Program Files\Microsoft SQL Server\100\DTS\Binn

Still rror comes: 
infile >> D:\pdf_upload\pre_idrs15_win_temporary_license_activation_tutorial.pdf
outFile >> D:\pdf_upload\processed\pre_idrs15_win_temporary_license_activation_tutorial.txt
Hello : This is java library path:(NICKRJ) C:\Program Files\Java\jdk1.7.0_51\bin;C:\WINDOWS\Sun\Java\bin;C:\WINDOWS\system32;C:\WINDOWS;C:/Program Files/Java/jdk1.7.0_51/jre/bin/server;C:/Program Files/Java/jdk1.7.0_51/jre/bin;C:/Program Files/Java/jdk1.7.0_51/jre/lib/amd64;C:\WINDOWS\system32;C:\Program Files\I.R.I.S. SA\iDRS_15_2_for_Win64_15_2_11_1717\lib\idrskrn15.lib;C:\Program Files\I.R.I.S. SA\iDRS_15_2_for_Win64_15_2_11_1717\bin\iDRMSGEBridgeDll.dll;C:\Program Files\I.R.I.S. SA\iDRS_15_2_for_Win64_15_2_11_1717\bin\iDRMSGEReaderDll.dll;C:\Program Files\Java\jdk1.7.0_51\bin;C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\include;C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\lib;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0;C:\Program Files (x86)\Microsoft SQL Server\100\Tools\Binn\;C:\Program Files\Microsoft SQL Server\100\DTS\Binn;D:\WorkSet\New folder\eclipse_kepler\eclipse;;.
Exception in thread "main" java.lang.UnsatisfiedLinkError: no iDRMSGEBridgeDll in java.library.path
    at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1886)
    at java.lang.Runtime.loadLibrary0(Runtime.java:849)
    at java.lang.System.loadLibrary(System.java:1088)
    at com.bi.iDRMSGEBridgeDll.callOcr(iDRMSGEBridgeDll.java:78)
    at com.bi.iDRMSGEBridgeDll.main(iDRMSGEBridgeDll.java:15)


Here is my Java JNI class:

package com.bi;

import org.omg.PortableInterceptor.SYSTEM_EXCEPTION;

public class iDRMSGEBridgeDll  
{
  public native int iDRMSGEDll_Initialize(String strPropertiesFileName);
  public native int iDRMSGEDll_VerifyLicense();
  public native int iDRMSGEDll_ConvertFile(String strSourceFileName, String srcOutputFileName,  String formatType);
  public native int iDRMSGEDll_Finalize();

public static void main(String[] args)
{
    //iDRMSGEBridgeDll.callOcr("bgimage.jpg","jpg","","d:\\","d:\\","4");
    iDRMSGEBridgeDll.callOcr("pre_idrs15_win_temporary_license_activation_tutorial.pdf","pdf","","D:\\pdf_upload","D:\\pdf_upload\\processed","4");


    /*  System.loadLibrary("iDRMSGEBridgeDll");
        iDRMSGEBridgeDll obj = new iDRMSGEBridgeDll();
        if ( obj.iDRMSGEDll_Initialize("D:\\iris\\iDRSGEDll.properties") != 0 ) {
            obj.iDRMSGEDll_Finalize();
            return;
        }
        System.out.println("iDRMSGEDll_Initialize success.");
        if ( obj.iDRMSGEDll_VerifyLicense() != 0 ) {
            obj.iDRMSGEDll_Finalize();
            return;
        }
        System.out.println("iDRMSGEDll_VerifyLicense success.");
        if (obj.iDRMSGEDll_ConvertFile("E:\\UI changes File_by Shakti\\PDF\\S14-005_FRAMEWORK_AGREEMENT_FOR_ENGINE_MAINTENANCE_SERVICES_EASYJET[1].pdf", 
            "E:\\SK_Converted_Files\\MVP_CONTRACTS\\Southwest CFM56-7\\S14-005_FRAMEWORK_AGREEMENT_FOR_ENGINE_MAINTENANCE_SERVICES_EASYJET[1]\\S14-005_FRAMEWORK_AGREEMENT_FOR_ENGINE_MAINTENANCE_SERVICES_EASYJET[1].txt", "4" ) != 0 ) {
            obj.iDRMSGEDll_Finalize();
            return;
        }
        System.out.println("iDRMSGEDll_ConvertFile 1 success.");
        /*if (obj.iDRMSGEDll_ConvertFile("C:\\Software\\iDRS_15_1_7_2304\\sample_pdfs\\scan1_200dpi.pdf", 
            "C:\\Software\\iDRS_15_1_7_2304\\sample_pdfs\\scan1_200dpi.out", 4) != 0 ) {
            obj.iDRMSGEDll_Finalize();
            return;
        }
        System.out.println("iDRMSGEDll_ConvertFile 2 success.");
        if (obj.iDRMSGEDll_ConvertFile("C:\\Software\\iDRS_15_1_7_2304\\sample_pdfs\\scan1_300dpi.pdf", 
            "C:\\Software\\iDRS_15_1_7_2304\\sample_pdfs\\scan1_300dpi.out", 4) != 0 ) {
            obj.iDRMSGEDll_Finalize();
            return;
        }
        System.out.println("iDRMSGEDll_ConvertFile 3 success.");
        if (obj.iDRMSGEDll_ConvertFile("C:\\Software\\iDRS_15_1_7_2304\\sample_pdfs\\scan2_300dpi.pdf", 
            "C:\\Software\\iDRS_15_1_7_2304\\sample_pdfs\\scan2_300dpi.out", 4) != 0 ) {
            obj.iDRMSGEDll_Finalize();
            return;
        }
        System.out.println("iDRMSGEDll_ConvertFile 4 success.");
        obj.iDRMSGEDll_Finalize();
        System.out.println("iDRMSGEDll_Finalize success.");
        return;*/

}
    public static String callOcr(String inputFile, String docType, String engineType, String filePath,String outputFolder,String type) throws RuntimeException
    {
        String message =  "";
        String formatType = type;           
        String inFile = filePath +"\\" +inputFile;
        String outFile="";
        if(type.equals("4"))
        outFile = outputFolder +"\\"+inputFile.substring(0,inputFile.lastIndexOf("."))+".txt";
        else if(type.equals("6"))
            outFile = outputFolder +"\\"+inputFile.substring(0,inputFile.lastIndexOf("."))+".rtf";
        else if(type.equals("9"))
            outFile = outputFolder +"\\"+inputFile.substring(0,inputFile.lastIndexOf("."))+".pdf";
        else
            outFile = outputFolder +"\\"+inputFile.substring(0,inputFile.lastIndexOf("."))+".csv";

        System.out.println("infile >> "+inFile);
        System.out.println("outFile >> "+outFile);
        System.out.println("Hello : This is java library path:(NICKRJ) " +System.getProperty("java.library.path"));

        System.loadLibrary("iDRMSGEBridgeDll");
        //System.load("C:\\Program Files (x86)\\I.R.I.S. SA\\iDRS_15_2_for_Win64_15_2_11_1717\bin\\iDRMSGEBridgeDll.dll");
        //Runtime.getRuntime().loadLibrary("iDRMSGEBridgeDll");

            iDRMSGEBridgeDll obj = new iDRMSGEBridgeDll();
        try
        {
            if ( obj.iDRMSGEDll_Initialize("D:\\IRIS\\iDRSGEDll.properties") != 0 ) {
                obj.iDRMSGEDll_Finalize();
            //  return ; 
            }
            System.out.println("iDRMSGEDll_Initialize success.");
            if ( obj.iDRMSGEDll_VerifyLicense() != 0 ) {
                obj.iDRMSGEDll_Finalize();
        //      return;
            }
            System.out.println("iDRMSGEDll_VerifyLicense success.");
        //  formatType= JOptionPane.showInputDialog("Please input mark format type: ");
            if (formatType!=null && formatType.equals("4"))  {
                obj.iDRMSGEDll_ConvertFile(inFile, 
                        outFile, "4" ); 
                obj.iDRMSGEDll_Finalize();
        //      return;
            }
            else if(formatType!=null && formatType.equals("6")) {
                obj.iDRMSGEDll_ConvertFile(inFile, 
                        outFile, "6" ); 
                    obj.iDRMSGEDll_Finalize();
            //      return;
                }   
            else if(formatType!=null && formatType.equals("7")) {
                obj.iDRMSGEDll_ConvertFile(inFile, 
                        outFile, "7" ); 
                    obj.iDRMSGEDll_Finalize();
            //      return;
                }
            else if(formatType!=null && formatType.equals("9")) {
                obj.iDRMSGEDll_ConvertFile(inFile, 
                        outFile, "9" ); 
                    obj.iDRMSGEDll_Finalize();
            //      return;
                }
            else
            {
            message= "iDRMSGEDll_VerifyLicense failure";
            }

            System.out.println("iDRMSGEDll_ConvertFile 1 success.");
            /*if (obj.iDRMSGEDll_ConvertFile("C:\\Software\\iDRS_15_1_7_2304\\sample_pdfs\\scan1_200dpi.pdf", 
                "C:\\Software\\iDRS_15_1_7_2304\\sample_pdfs\\scan1_200dpi.out", 4) != 0 ) {
                obj.iDRMSGEDll_Finalize();
                return;
            }
            System.out.println("iDRMSGEDll_ConvertFile 2 success.");
            if (obj.iDRMSGEDll_ConvertFile("C:\\Software\\iDRS_15_1_7_2304\\sample_pdfs\\scan1_300dpi.pdf", 
                "C:\\Software\\iDRS_15_1_7_2304\\sample_pdfs\\scan1_300dpi.out", 4) != 0 ) {
                obj.iDRMSGEDll_Finalize();
                return;
            }
            System.out.println("iDRMSGEDll_ConvertFile 3 success.");
            if (obj.iDRMSGEDll_ConvertFile("C:\\Software\\iDRS_15_1_7_2304\\sample_pdfs\\scan2_300dpi.pdf", 
                "C:\\Software\\iDRS_15_1_7_2304\\sample_pdfs\\scan2_300dpi.out", 4) != 0 ) {
                obj.iDRMSGEDll_Finalize();
                return;
            }
            System.out.println("iDRMSGEDll_ConvertFile 4 success.");*/
            obj.iDRMSGEDll_Finalize();
            System.out.println("iDRMSGEDll_Finalize success.");
            if(message.length()==0)
            {
                message = "success";
            }
        }
        catch(Exception e)
        {
            e.printStackTrace();
            message = e.getMessage();
        }

        return message;





    }


}


文章来源: java.lang.UnsatisfiedLinkError no *****.dll in java.library.path