2014-05-17 3 views
0

두 개의 클래스가있는 이클립스 프로젝트가 있습니다.네이티브 라이브러리를 자바에 로딩하기

SomeClass1

public class SomeClass1 { 
    static { 
     System.loadLibrary("libname"); // Load the native library. 
    } 
    public native void some_method(); // implemented in the library 
    // .... other non methods .... 
} 

다른 클래스 "SomeClass2"는 "SomeClass1"의 기본 메서드를 사용하여 클래스 "SomeClass1는"네이티브 메소드가 있습니다. 마찬가지로 :

SomeClass2

public class SomeClass2{ 
    public static void main(String[] args) { 
     SomeClass1 s = new SomeClass1(); 
     s.some_method(); 
    } 
    // ....other methods.... 
} 

그러나이 방법은이 같은 오류가 발생 것을 호출 할 때 :

Exception in thread "main" java.lang.UnsatisfiedLinkError: no libname in java.library.path 
.... 
at java.lang.System.loadLibrary(Unknown Source) 
at x.x.x.SomeClass1.<clinit>(SomeClass1.java:128) 
at SomeClass2.main(SomeClass2.java:10) 

나는 오류가 어디에 모르고 자바 함께 할 수있는 뭔가가 생각을 네이티브 라이브러리를 찾으십시오.

Question1 내가 사용 : 이클립스 실행 인수로 "\ 사용자 ..... \ libfolder의 \ C"와 값 인쇄 : -Djava.library.path =이 System.getProperty를을 ("자바 .library.path "); 내가 디렉토리의 많은 인쇄 볼 수 있지만 내가 인수에서 지정한 디렉토리가 아닙니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?

질문 2 내가 할 때 : System.loadLibrary ("name"); 라이브러리 "name.so"또는 "libname.so"를 호출해야합니까?

Question3 라이브러리를 찾을 수 있지만,이에로드 된 플랫폼은 또한 UnsatisfiedLinkError를 줄 것이라고하거나 다른 오류가 주어질 것, 32 비트 상태에서 64 비트 라이브러리이었다 될 경우?

질문 4 라이브러리가로드되는 파일과 관련하여 프로젝트 폴더 또는 라이브러리를 기준으로 라이브러리 경로를 지정할 수 있습니까?

희망 사항 (내 질문 중 일부)에 답변 해 줄 수 있기를 바랍니다.

Grtz 스테판

+1

질문 2 : 귀하의 예제 라이브러리 경로는'name.dll 될 줄 창문에 제안 ' –

답변

1

질문 1 :

당신은 실행 인수로이 추가하지만 VM 인수로는 안된다. 그것은 프로그램에 대한 논쟁이 아니라 JVM을위한 것입니다.

질문 2 : (또한 @IanRoberts)

다음 System.loadLibrary(name) 호출은 지정된 이름의 실제 라이브러리의 이름을 파생 자동으로됩니다. 즉, 윈도우에 ".dll"을 추가하고 리눅스에서는 "lib" + name + ".so"을 사용합니다. 그렇지 않으면 플랫폼에 독립적 인 방식으로 기본 lib를로드 할 수 없습니다!

질문 3 : 일반적으로

UnsatsfiedLinkError는 참혹 일반적이다. 실제로 말하는 것이 사실입니다 : UnsatisfiedLinkError은 "뭔가 잘못되었습니다"이상을 말하지 않습니다.당신은 실제 오류 메시지가 더 설명 할 희망 할 수 있으며, 32/64 비트 불일치가 있다면이 (다행히)의 경우가 될 것입니다 - 적어도 창에 :에에서는 lib 32 비트를로드하려고

  • "AMD 64 비트 플랫폼에서 IA 32 비트 .dll을로드 할 수 없음"
  • 32 비트 시스템에서 64 비트 lib를로드하려고하면 다음 메시지가 표시됩니다. ". .. 유효한 Win32 응용 프로그램이 아닙니다. "

(다른 메시지에 대해서는 확실하지 않습니다. 운영 체제는하지만, 그러나 당신의 메시지가 라이브러리 자체)에 문제가 있다는 라이브러리가 바로 발견되지 않았 음을 나타냅니다, 그리고 하지

(질문 4 :이 가능하다는 것을 오히려 확신, 하지만 은 절대적으로이 아닙니다. 지금은 시도 할 수 없습니다. 일반적으로 라이브러리는 PATH 환경 변수를 통해 또는 java.library.path을 통해 보이는 경로에 있어야합니다. 의문의 여지가, 그것은 항상 다음 네이티브 라이브러리 libs 디렉토리에서 귀하의 프로그램을 시작하는 곳에서 작동합니다)

+0

감사합니다. – Stefan