해결lang.UnsatisfiedLinkError: Native Library .dll already loaded in another
1510 단어 library
1
xxx NOT loaded java.lang.UnsatisfiedLinkError : Native Library XXX.dll already loaded in another classloader
appletB에서 appletA에 접근하면 appletA에 접근할 때도 같은 오류가 발생합니다.한 탭에서 여러 개의 applet이 실제적으로 같은 jvm에서 실행되고, 단지 applet을 불러올 때 다른classLoader를 사용했기 때문이다.따라서 appletA가 먼저 실행되든 appletB가 먼저 실행되든 최종 상황은 의존하는 dll이 같은 jvm에 불러오면 이상의 오류가 발생할 수 있습니다.구글을 진행한 후에 많은 개발자들이 같은 문제에 부딪혔다. 어떤 것은 같은javaEE 용기, 예를 들어 (weblogic, jboss) 중부에 두 개의 jni 호출 프로젝트를 방문해야 하기 때문이다. 어떤 것은 필자와 같은 경험이다.마지막 결론은 한 jvm에서 dll을 두 번 불러오는 것을 허용하지 않는다는 것이다.따라서 뒤에 있는 jni를 호출할 때 같은 dll을 다시 불러오려고 시도하면 위의 오류를 보고합니다.이 오류로 인해 대응하는 자바 클래스는 초기화될 수 없기 때문에 해당 항목이나 applet은 시작할 수 없습니다.
이 문제를 해결하는 것은 사실 매우 간단하다. jni에 접근한 코드를 단독으로 추출하여 프로젝트 자체의classLoader를 직접 불러오지 않고 시스템Loader에서 불러오면 된다.한 가지 방법은 이 부분의 코드를 단독으로jar로 봉하여 자바의 시스템Loader가 불러올 수 있는 곳, 예를 들어lib/ext 디렉터리에 넣는 것이다.그리고 프로젝트에서 이 코드를 호출합니다.dll에 접근하는 코드는 시스템로드러에서 불러오기 때문에 여러 항목이 같은 dll에 동시에 접근할 때 다시 불러오는 것을 피할 수 있습니다.두 번째 항목이 접근할 때 찾은 클래스는 시스템로드러에 의해 불러왔기 때문에 프로젝트 자체의classLoader는 이 클래스를 다시 불러오지 않습니다.
비교해 보면 원래의 appletA, appletB는 수정된 후에 이러한 구조가 되었다. appletA, appletB, 그리고 jniAccess.jar, 여기서 jniAccess.jar는 jre의lib 디렉터리의 ext 디렉터리에 있습니다.이렇게 하면 애플릿을 다시 방문하면 문제가 없습니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
C#은 텍스트와 이미지가 포함된 PowerPoint 독을 생성합니다.PowerPoint 문서(슬라이드)는 일반적인 프레젠테이션의 문서이며, 스피치, 교육, 제품의 프레젠테이션 등의 면에서 널리 응용되고 있다. 이 문은 간단한 PowerPoint 파일을 만드는 방법을 보여줍니다. 다음...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.