2011-10-02 3 views
15

C++로 작성되고 다른 운영 체제 용으로 컴파일 된 공유 라이브러리를 사용하는 Java 응용 프로그램을 빌드하고 있습니다. 문제는이 공유 라이브러리 자체가 적절한 환경 변수 (PATH, LIBRARY_PATH 또는 LD_LIBRARY_PATH)에서 일반적으로 발견되는 추가 라이브러리에 의존한다는 것입니다.런타임시 공유 라이브러리로드 경로

이 환경 변수를 설정할 수는 있지만 설정할 수는 없습니다. 차라리 플러그인처럼 런타임에 주어진 경로에서 필요한 공유 라이브러리를로드하고 싶습니다. 그리고 아니오 - 저는 새로운 환경에서 새로운 프로세스를 시작하는 시작 응용 프로그램을 원하지 않습니다. 아무도 이것을 달성하는 방법을 알고 있습니까?

내가 사용하는 라이브러리 중 하나가 주어진 경로에서 플러그인을로드 할 수 있기 때문에 이것이 가능해야한다는 것을 알고 있습니다. 물론 플랫폼 독립적 인 코드를 선호하지만, 가능하지 않은 경우 Windows, Linux 및 MacOS 용 별도 솔루션을 사용할 수도 있습니다. 내가 공유 라이브러리 내가 사용하고자하는 거라고 언급해야

편집 단일 기능의 바인딩이 그것을하지 않을 즉, 객체 지향이다.

+0

Java에서 라이브러리를 어떻게로드합니까? –

+0

Java Native Access (JNA) – aRestless

답변

8

Windows의 경우 LoadLibrary을 사용할 수 있으며 Linux의 경우 dlopen을 사용할 수 있습니다. API는 매우 유사하며 전체 경로를 제공하여 직접/dll을로드 할 수 있습니다. 런타임 종속성이있는 경우 작동합니다 (로드 후 "연결"하면 GetProcAddress/dlsym).

15

Un UNIX/Linux 시스템에서는 dlopen을 사용할 수 있습니다. 거기에서()

typedef int (*some_func)(char *param); 

void *myso = dlopen("/path/to/my.so", RTLD_NOW); 
some_func *func = dlsym(myso, "function_name_to_fetch"); 
func("foo"); 
dlclose(myso); 

.so를로드하고 function_name_to_fetch을 실행 :이 문제는 다음 dlsym

간단한 예를 통해 당신이 필요로하는 모든 문자를 가져올 필요가있다. 자세한 내용은 dlopen (1) 맨 페이지를 참조하십시오.

+0

공유 라이브러리 자체가 객체 지향이라고 추가해야한다고 생각합니다. 함수 만 "링크"될 수 있다면, 이것은 제대로 작동하지 않을 것입니다. – aRestless

+0

링커에서 생성 한 이름을 알고 있으면 모든 심볼에 액세스 할 수 있습니다. 좋은 연습은 객체 또는 무언가를 포함하는 구조체에 대한 포인터를 반환하는 C 호출 규칙을 사용하는 함수를 갖는 것입니다. – johannes

+0

글쎄, 나는 이미 그렇게했다. 자바를 통해 라이브러리에 접근하는 것이다. 내가 쓰고있는 C++ 라이브러리는 서드 파티 라이브러리를 사용하는 스텁 일 뿐이며 (나는 변경할 수 없다). – aRestless

1

나는 그것을 위해 할 수 있다고 생각하지 않습니다.

대부분의 DLL에는로드 된 후에 호출해야하는 일종의 init() 함수가 있으며 일부 함수는 매개 변수가 필요하고 dll 함수를 호출하는 데 사용되는 핸들을 반환합니다. 추가 라이브러리의 정의를 알고 있습니까?

그런 다음 첫 번째 라이브러리는 DLL X가 해당 이름을 사용하여 RAM에만 있는지 단순히 볼 수 없습니다. 필요한 디렉토리는 다른 디렉토리이거나 다른 빌드/버전 일 수 있습니다. 전체 경로가 이미로드 된 다른 경로와 동일한 경우 OS가 라이브러리를 인식하고 두 번째로드하는 대신 공유합니다.

다른 라이브러리는 다른 경로에서 플러그인을로드 할 수 있습니다.이 라이브러리는 PATH에 의존하지 않고 작성되었으며 자체 플러그인입니다.

Dll을로드하기 전에 프로세스의 환경 변수를 코드에서 업데이트하려고 시도한 적이 있습니까? 그것은 시동기 과정에 달려 있지 않습니다.

3

다른 포스터와 함께 dlopen 및 LoadLibrary 사용에 동의합니다. libltdl은 이러한 기능에 대한 플랫폼 독립적 인 인터페이스를 제공합니다.

관련 문제