문제

내 웹 애플리케이션에 사용자 정의 DLL 파일을로드하려면 어떻게해야합니까? 나는 다음과 같은 방법을 시도했지만 실패했다.

  • 필요한 모든 DLL을 복사했습니다 system32 폴더를 넣고 그 중 하나를로드하려고했습니다 Servlet 건설자 System.loadLibrary
  • 필요한 DLL을 복사했습니다 tomcat_home/shared/lib 그리고 tomcat_home/common/lib
  • 이 모든 DLL이 있습니다 WEB-INF/lib 웹 응용 프로그램
도움이 되었습니까?

해결책

위해서는 System.loadLibrary() 작동하려면 라이브러리 (Windows, DLL)는 귀하의 어딘가에 디렉토리에 있어야합니다. PATH 또는 에 나열된 경로에서 java.library.path 시스템 속성 (따라서 Java Like를 시작할 수 있습니다 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) PATH 또는 java.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() {
    }

}

다른 팁

런타임에서 '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);

전리품을 가져 가십시오. 런타임시 Java 라이브러리 경로 변경.

Adam Batkin의 원본 답변은 솔루션으로 이어질 것이지만 웹 컨테이너를 다시 시작하지 않고 웹 앱을 재배치하면 다음 오류가 발생해야합니다.

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 개의 참조를 허용하지 않기 때문에 할 수 없습니다. 다시로드 그것. 따라서 WebApp은 기존 DLL에 액세스 할 수 없으며 새 DLL을로드 할 수 없습니다. 그래서 .... 당신은 붙어 있습니다.

Tomcat의 클래스 로더 문서 Reloaded 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) {
        }

    }

그런 다음이 컴파일 된 클래스 만 포함 된 항아리를 Tomcat_home/Lib 폴더에 넣습니다.

이제 WebApp 내에서 Tomcat 이이 클래스를 참조하도록 강요하면됩니다.

  Class.forName("awesome.Foo");

이제 DLL을 공통 클래스 로더에로드해야하며 재배치 한 후에도 WebApp에서 참조 할 수 있습니다.

이해가 되나요?

작업 참조 사본은 Google 코드에서 찾을 수 있습니다. 정적 dll-bootstrapper .

당신이 사용할 수있는 System.load() 각 OS의 표준 라이브러리 폴더의 파일 대신 원하는 절대 경로를 제공합니다.

이미 존재하는 기본 응용 프로그램을 원한다면 사용하십시오. System.loadLibrary(String filename). 자신을 제공하고 싶다면 load ()를 더 잘할 수 있습니다.

또한 사용할 수 있어야합니다 loadLibrary 이랑 java.library.path 올바르게 설정하십시오. 보다 ClassLoader.java 확인중인 두 경로를 보여주는 구현 소스 (OpenJDK)

문제가 System.LoadLibrary가 문제의 DLL을 찾을 수 없다는 경우, 하나의 일반적인 오해 (Java의 오류 메시지에 의해 강화 됨)는 시스템 속성 java.library.path가 답변이라는 것입니다. 시스템 속성을 설정하면 DLL이있는 디렉토리에 System.LoadLibrary가 실제로 DLL을 찾습니다. 그러나 DLL이 다른 DLL에 의존하는 경우 종종 다른 DLL에 의존하는 경우, 종속 DLL의 로딩은 전적으로 운영 체제에 의해 관리되기 때문에 Java.library.Path는 도움이되지 않습니다. 길. 따라서 JVM을 시작하기 전에 java.library.path를 우회하고 DLL의 디렉토리를 ld_library_path (linux), dyld_library_path (macOS) 또는 경로 (Windows)에 추가하는 것이 거의 항상 낫습니다.

(참고 : DLL 또는 공유 라이브러리의 일반적인 의미에서 "DLL"이라는 용어를 사용하고 있습니다.)

현재 디렉토리와 같은 이미 디렉토리와 관련된 파일을로드 해야하는 경우 다음은 쉬운 솔루션입니다.

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

찾고있는 사람들을 위해 java.lang.UnsatisfiedLinkError: no pdf_java in java.library.path

나는 같은 예외에 직면하고 있었다. 나는 그것을 작동시키기 위해 모든 것을 시도했습니다.

  1. PDF LIB.JAR의 올바른 버전 (제 경우에는 서버 런타임에 보관 된 잘못된 버전이었습니다)
  2. 폴더를 만들고 pdflib 항아리를 유지하고 경로 변수에 폴더를 추가하십시오.

Tomcat 6과 함께 일했습니다.

가난한 날 ! 이 문제를 복제하면 하루 종일이 뒤에 보냈습니다.

Adam이 제안한대로로드하려고했지만 AMD64 vs IA 32 Exception에 걸렸습니다. 어쨌든 Adam 's (최고의 선택) 연습으로 작업 한 후 64 비트의 최신 JRE.make를 사용해보십시오. JRE와 JDK는 64 비트이며 클래스 경로에 올바르게 추가했습니다.

내 작업 예제는 여기에 있습니다.조정되지 않은 링크 오류

  1. 기본 LIB의 경로를 %PATH %에 추가했다고 생각되면 다음과 같이 한 번 더 테스트하십시오.

    System.out.println (System.GetProperty ( "java.library.path")))

DLL이 %경로 %인 경우 실제로 표시해야합니다.

  1. IDE 아이디어를 다시 시작하십시오. 예, %경로 %에 추가하여 ENV 변수를 설정 한 후에 나에게 효과가있는 것 같습니다.

Windows의 경우 Filles (jd2xsx.dll 호출 및 ftd2xx.dll)를 Windowws/System32 폴더에로드했을 때 문제가 해결되었습니다. 그런 다음 새로운 FD2XX.DLL이 매개 변수와 관련이 있어야하는 데 문제가 있었기 때문에이 DLL의 이전 버전을로드해야했습니다. 나중에 이것을 괴롭 혔을 것입니다.

참고 : jd2xsx.dll은 ftd2xx.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

누군가에게 유용 할 수 있기를 바랍니다. 솔루션을 찾은 링크는 다음과 같습니다.java.library.path - 그것은 무엇이며 사용 방법

나는 같은 문제가 있었고 오류는 DLL의 이름을 바꿨 기 때문입니다. 도서관 이름이 DLL 내부 어딘가에 기록 될 수 있습니다. 원래 이름을 되돌릴 때 사용하면로드 할 수있었습니다. System.loadLibrary

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;





    }


}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top