2009-12-29 3 views
3

지정한 폴더에서 모든 클래스를로드하는 프로그램을 작성하고 있습니다.네이티브 코드 종속성을 사용하여 Java 클래스로드

일부 클래스는 정적 블록에 개체를 생성하고 있으며 이러한 개체는 생성하는 동안 일부 기본 호출을 생성합니다. 나는 네이티브 라이브러리가 없기 때문에 java.lang.UnsatisfiedLinkError를보고있다.

다음은 예제 시나리오이다.

Class A extends SuperA 
{ 
    public static B b = new B(); 
    ... 
    ... 
} 

Class B 
{ 
    public B() 
    { 
     someNativeCall(); // Causing the LinkError 
    } 
} 

Class.forName("A"); // Loading of Class A 

나는 B가 생성 된 경우 그래서 신경도하지 않는 등의 슈퍼 클래스와 같은 속성의 일부를 확인하거나 같은 많은 종류가있을 수 있기 때문에 을 :)하지 여기에 클래스 A를 로딩하고 있습니다 A 주어진 폴더에 A와 같은 클래스의로드가 실패하지 않도록하는 일반적인 방법이 있습니까?

업데이트 : 네이티브 라이브러리가 있어야하며 어떻게 추가해야하는지 알고 있습니다. 하지만 난 네이티브 라이브러리가 없으므로이 해킹을 요구하고 있습니다.

+0

가, 할 수있다 우리는 B와 같은 모든 클래스를 식별하고 모의 B 객체를 삽입합니까? 나는 그것을 성취 할 수있는 방법을 모른다. – Varun

+0

http://stackoverflow.com/questions/1029559/java-system-loadlibrarysomedllfile-gets-unstatisisfied-link-error – finnw

+0

구현 한 솔루션 : javap은 프로그래밍 방식으로 액세스 할 수 있지만 API는 분명하지 않습니다. 마지막으로 http://jakarta.apache.org/bcel/manual.html에서 Java 리플렉션과 비슷한 명확한 API를 사용했습니다. – Varun

답변

3

네이티브 함수를 구현하는 .DLL 또는 .so는 시스템 경로에 있어야합니다. VM은 loadlibrary를 호출하여 관련 .dll/.so를로드하고 발견되지 않으면 UnsatisfiedLinkError를 발생시킵니다.

UnsatisfiedLinkError를 catch하여 문제를 무시할 수 있지만이 클래스를 사용하는 클래스는 사용할 수 없습니다.

클래스를 검사하지만 실제로 사용하지 않으려면 Java Dissasembeler, javap을 사용할 수 있습니다. javap은 패키지 sun.tools.javap에 정의되어 있으며 구현은 $ JDK \ lib \ tools.jar에 있습니다.

+1

JVM 경로에서만 시스템 경로에 "필요"하지 않습니다. 위에서 언급 한 Java 실행 플래그를 참조하십시오. – whatnick

+0

나는 나와 함께 네이티브 라이브러리가 없습니다.응용 프로그램을 실행하고 싶지 않고 많은 클래스를로드해야 할 필요가 있기 때문에 해킹을 찾고 있습니다. – Varun

+1

@whatnick 매우 정확합니다. java.library.path를 사용하면 더 구체적 일 수 있지만 두 방법 중 하나를 사용할 수 있습니다./여러 버전의 라이브러리가있는 경우 안전합니다. –

0

왜 네이티브 라이브러리가없는 클래스가 있습니까? 파생 클래스는 기본 클래스를 초기화 할 수없는 경우 작동하지 않습니다. -Djava.library.path를 사용하여 기본 라이브러리의 위치를 ​​지정하십시오. 당신은해야합니다

+0

네이티브 라이브러리를 사용할 수 없으면 전체적인 문제입니다. 가능하다면 나는 그것을 추가했을 것입니다 :) – Varun

+0

네이티브 라이브러리의 목적은 무엇입니까? 비슷한 것으로 대체 될 수 있습니까? – Esko

1

중 하나를 수정하려면 더 이상 B에 따라, 또는 다른

특히 B를 대체 할 다른, 당신은 할 수 있습니다 더 이상 네이티브 코드에 대한 종속성을 가지고 있으므로 B를 수정하지 않거나 있도록 사용자 지정 ClassLoader을 사용하고 네이티브 종속성이 없다는 점에서 제공된 것과 다른 고유 한 버전의 B를 수동으로로드하십시오. 그런 다음 A를 똑같이 ClassLoader에로드하고 원하는 것을하십시오.

+0

@Dan 매우 흥미 롭습니다. 좀 더 설명해 주시겠습니까? – Varun

1

누락 된 네이티브 라이브러리의 모의 버전을 생성, 컴파일 및로드 할 수 있습니까? 그래도 많은 일이 그래 보인다. 당신이 클래스 또는하지를 초기화 할 (그리고 당신은 단지 그것을 조금을 반영 할 경우,하지) 여부를 지정할 수 있습니다 Class.forName의 과부하있다

2

: 런타임시

class X { 

    static { if (true) throw new ExceptionInInitializerError("OH NOES!!!"); } 

} 

public class Y { 
    public static void main(String[] args) throws Throwable{ 
     // Breaks: 
     System.out.println(Class.forName("X").getSuperclass()); 
     // Works: 
     ClassLoader cl = Thread.currentThread().getContextClassLoader(); 
     System.out.println(Class.forName("X", false, cl).getSuperclass()); 
    } 
} 
+0

감사합니다. 나는이 API를 알지 못한다. 이것은 완벽하게 잘되었을 것이다 :) – Varun

관련 문제