2010-04-07 5 views
2

이상한 문제가 있습니다.다른 기본 라이브러리를로드하는 네이티브 라이브러리를 호출 할 때 JNI 문제

에 MyLibrary
--loads DLL_A
----로드

내가에서 LoadLibrary()와 DLL_A를로드 DLL_B, 랩 : 나는 기본적으로 같은 타사 DLL에 대한 래퍼 C++에서 프로젝트를 몇 가지 함수와 내 자신의 DLL을 생성합니다. 나는 이것을 C++ 프로젝트와 C# 프로젝트에서 테스트했다. 둘 다 DLL_A를로드하고 몇 가지 함수를 호출하며 DLL_B를 간접적으로로드해야합니다. 문제는 내가 자바 용 DLL을 만들고 JNI를 통해 호출을 할 때이다. DLL (DLL_A가 DLL_B를로드 할 때가되면 작동하지 않습니다. 디버깅에서 DLL_B로드는 콜백을 사용하는 DLL_A의 함수 호출에서 발생합니다. Java에서 호출 할 때이 함수 호출이 실패한 것처럼 보입니다. (함수 포인터가 좋으며 실제 호출이 문제없이 작동합니다.) DLL_B가로드에 실패하여 프로그램이 대기 중입니다라는 홀수 팝업 창이 나타납니다. 절대로 발생하지 않는 콜백. 나는 DLL_B를 Java와 C++에서 모두 정밀하게로드 할 수 있으며 모든 가능한 경로, 경로 변수를 확인한 다음 dll을 배치하여 어디서나 재미있는 곳을 찾을 수 있는지 확인했습니다. 경로 문제가 아니라고 확신합니다.

궁극적으로 DLL_A가 DLL_B를로드하는 방법을 모르겠지만 모든 것이 C++ 및 C#에서 제대로 작동하지만 Java에서는 작동하지 않는 이유를 알 수 없습니다. 나는 절대적으로 난처했다. 그것은 여전히 ​​내 설정에 특정한 것이 될 수 있지만 (비록 내가 볼 수있는 것처럼 열심히 보았지만),이 시나리오를 던져서 비슷한 문제가 발생했는지 확인합니다.

-Dave

답변

2

정말 하나의 DLL이 Windows의 또 다른 하나를로드 할 수있는 두 가지 방법이 있습니다 - 중 그들은 그것이 명시 적으로 LoadLibrary()를 사용하여이 작업을 수행하거나이 두 번째의 가져 오기 라이브러리에 대한 최초의 DLL을 연결하여 암시 적이다. DLL_B가 DLL_A의 종속성인지 아닌지 확인하려면 Dependency Walker을 사용할 수 있어야합니다. 또한 DLL_B가 암시 적으로 링크되어있는 경우 DLL_B가 경로에있는 경우 depwalker를 실행하면 표시됩니다.

또한 DLL_B에 대한 depwalker를 실행하여 DLL_B에 대한 놀라운 종속성이 없는지 확인합니다. DLL_B가 DLL_B가 아닌 DLLB가 아닌 DLLB를로드 할 수 없기 때문에 발생하는 문제 일 수 있습니다. DLL_B를 찾으십시오.

IIRC Windows는 암시 적으로 링크 된 라이브러리에 대해 PATH를 검색하므로 java 프로세스 호출이 경로와 함께 재생되는지 확인하십시오. LoadLibrary에 대한 설명서는 LoadLibrary가 DLL을 검색하는 방법을 설명합니다.

Java에서 DLL_B를 직접로드 관리 할 수 ​​있다고하셨습니다. 그렇게하고 DLL_A를 통해 호출하면 콜백 메커니즘이 작동하기 시작합니까? 당분간 이것은 다소 추한 해결 방법 일 수 있습니다.

관련 문제