2011-05-14 2 views
1

[최종 해결 방법은 수락 된 대답에 대한 설명에서 찾을 수 있습니다. bmargulies 감사합니다]Java - JNA 및 공유 라이브러리, Linux에서 .jar로 시작할 때 UnsatisfiedLinkError

안녕하세요 여러분,

나는 아주 이상한 오류가있어 내가 이유를 알아낼 수 없습니다. 그래서 여기에 설치가 있습니다 : 저는 자바에서 플랫폼 독립적 인 음악 플레이어를 만들고 있습니다. 네이티브 사운드 라이브러리로서 저는 irrKlang 엔진 (http://www.ambiera.com/irrklang/)을 사용하고 있습니다.이 엔진은 각각 Windows, Linux 및 MacOS 용 공유 라이브러리 세트로 제공됩니다. 이 라이브러리는 C++로 작성 되었기 때문에 필요한 각 운영 체제 용으로 컴파일 된 래퍼 (C++, extern "C"등)를 사용하여 공유 라이브러리를 구축했습니다. 이제 JNA에서 래퍼를 사용합니다. 이클립스를 사용하고 있는데, 프로젝트의 메인 폴더 (현재 작업 디렉토리)에 필요한 모든 라이브러리 저항이 있습니다. 이제는 문제가 생깁니다. Eclipse에서 Java 응용 프로그램을 실행하고 Windows의 .jar를 프로젝트의 기본 폴더에 빌드하고 실행하면 모든 것이 잘 작동합니다. 아무 문제가 없습니다.

Exception in thread "main" java.lang.reflect.InvocationTargetException 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
at java.lang.reflect.Method.invoke(Method.java:616) 
at org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader.main(JarRsrcLoader.java:58) 
Caused by: java.lang.UnsatisfiedLinkError: Unable to load library 'IrrklangWrapper': libIrrKlang.so: cannot open shared object file: No such file or directory 
at com.sun.jna.NativeLibrary.loadLibrary(NativeLibrary.java:163) 
at com.sun.jna.NativeLibrary.getInstance(NativeLibrary.java:236) 
at com.sun.jna.Library$Handler.<init>(Library.java:140) 
at com.sun.jna.Native.loadLibrary(Native.java:379) 
at com.sun.jna.Native.loadLibrary(Native.java:364) 
at Demo.<init>(Demo.java:29) 
at Demo.main(Demo.java:55) 
... 5 more 
는 "IrrKlangWrapper는"내 자신의 공유 라이브러리이다 "libIrrKlang.so는"도서관이

입니다 : 나는의 .jar로 (! 보통 작업) 응용 프로그램 팩 때 특히 리눅스에, 나는 다음과 같은 오류가 발생합니다 그것으로 싸여있다. 따라서 JNA는 내 라이브러리를 찾을 수 있지만 내 라이브러리는 감싸 인 것을 찾을 수 없습니다. 기묘한! 특히 프로젝트를 직접 시작하는 경우 (.jar을 만들지 않고)이 작업이 발생하지 않기 때문에 특히 그렇습니다.

여러분 중 일부는 C++로 작성된 코드를 요청할 수도 있습니다. 문제의 원인이 여기에 위치하지는 않지만 포함 된 메소드가 호출되기 전에 오류가 발생하기 때문에 다음과 같이 말합니다.

#include <iostream> 
#include <stdio.h> 
#include <irrKlang.h> 
#include <sys/stat.h> 
#include <string> 
#include <unistd.h> 
using namespace std; 

extern "C" { 

int func(char *path) { 
    cout << path << endl; 

    irrklang::ISoundEngine* engine = irrklang::createIrrKlangDevice(); 
    engine->loadPlugins("./"); 
    cout << engine->getDriverName() << endl; 
    engine->play2D(path); 
    //Endless loop for testing. TODO: Remove 
    while (true) { 
    } 
    engine->drop(); 

    return 0; 
} 
} 

누구든지이 문제를 해결하는 방법을 알고 있습니까? 내 응용 프로그램이 플랫폼에 독립적으로 만들려고하므로 공유 라이브러리를 특정 폴더에 복사 할 수 없습니다. 응용 프로그램의 (하위) 폴더에 있어야합니다. 사전에

감사합니다, 리눅스에

앙드레

답변

3

당신은 두 번째 공유 라이브러리 것을 들어있는 디렉토리를 포함하도록 LD_LIBRARY_PATH를 설정해야합니다.

이 요구 사항은 해결하기가 매우 어렵습니다. LD_LIBRARY_PATH는 자바 프로세스가 시작될 때 ld.so에 의해서만 읽혀진다. 나중에 추가 할 수 없습니다.

하나의 커다란 공유 라이브러리를 만들어야합니다. 즉, .a 버전의 의존성을 찾아서 통합해야합니다.

+0

나는 이미 그럴 수 있다고 생각했습니다. 어떻게 C++ 코드에서이 작업을 수행 할 수 있습니까? 그리고 : 직접 실행될 때 왜 작동합니까? –

+0

리눅스에서 '직접'* 작동합니까? – bmargulies

+0

있습니다. 일식에서 시작하면 프로젝트의 기본 폴더에있는 공유 라이브러리가 사용됩니다. –

관련 문제