2011-08-01 4 views
1

나는이 문제에 관해 많은 게시물을 읽었지만 아무도 내 문제를 해결하지 못했습니다.다른 JNI UnsatisfiedLinkError DLL 문제

Java 프로세스에서 Windows 메시지를 보낼 수있는 매우 작은 DLL이 있습니다. 그때 나는 만족 링크 오류가 VS2005와/MT와 연결하고 모든 괜찮지 만 내 DLL을 만들려고하면 MSVCRT에 따라 달라집니다 및/MD와 링크 것으로 집계했다

FindWindowEx(...) 
    SendMessage(...) 

그것은 단순히 호출합니다.

에서 java.lang.UnsatisfiedLinkError : MyDll.dll : 종속 라이브러리가이 누락 된 DLL을, GPSVC.DLL 및 IESHIMS.DLL을 가지고 Depends.exe를에 따르면

를 찾을 수 없습니다. 첫 번째 파일은 c : \ windows \ system32에 있고 두 번째 파일은 winsxs 경로에 있습니다. c : \ windows \ system32에서로드 된 다른 DLL의로드가 있고 GPSVC.DLL이 win7x64 시스템의 관리자 일지라도 실행할 수 없다는 말은 이상합니다.

어쨌든, 나는에 의해 내 자바에서 그 DLL을 모두의 부하를 강제로 시도 (간체 - 내가 java.library.path의 통제 아니에요)

Field field = ClassLoader.class.getDeclaredField("usr_paths"); 
    field.setAccessible(true); 
    String[] paths = (String[]) field.get(null); 
    String[] tmp = new String[paths.length + 2]; 
    System.arraycopy(paths, 0, tmp, 0, paths.length); 
    tmp[paths.length] = "c:/windows/system32"; 
    tmp[paths.length + 1] = "c:/Windows/winsxs/amd64_microsoft-windows-ie-ieshims_31bf3856ad364e35_8.0.7601.17514_none_c06d7c9c27da8591"; 
    field.set(null, tmp); 

하지만 그 차이를하지 않았다. 정적으로 연결되도록 폴백 할 수는 있지만 오히려하지 않을 것입니다.

다음에 시도 할 수있는 아이디어가 있습니까? Antony

답변

0

글쎄, 저는 Visual Studio 2010을 사용하고 있지만 2005에서도 작동 할 수 있습니다.

/MicrosoftVisualStudio20xx/VC의 ProgramFiles에서 찾을 수있는 vcvarsall.bat를 사용하여 VC 컴파일러를 구성 해보십시오.

명령 줄에서 x86 또는 ia64 또는 x86_amd64 또는 x86_ia64 옵션 중 하나를 사용하여 vsvarsall.bat를 실행하기 만하면됩니다. 도움이 될지 모르지만 VC 컴파일러가 64 비트 시스템에서 작동하도록 구성되지 않은 문제 중 하나 일 수 있습니다.

JNI로 작업 할 때 명령 줄을 사용하여 코드를 컴파일하면 64 비트 시스템에서 컴파일러를 구성해야했습니다.

또는 커맨드 라인을 통해 컴파일하려고 시도 할 수 있습니다. 여기 내가 제일 좋아하는 튜토리얼입니다 http://www.ibm.com/developerworks/java/tutorials/j-jni/index.html

+0

나는 내 DLL을 32 비트와 64 비트 버전으로 만들고 필요에 따라 x86 또는 amd64로 vcvarsall을 실행합니다. 내 CL 명령 행은 다음과 같습니다 : cl/I % JAVA_HOME % \ include/I % JAVA_HOME % \ include \ win32/nologo/W4/EHsc/O2/D "NDEBUG"/ D "WIN32"/ D _USRDLL/MT/LD PresencePump.cpp /FePresencePump-%1.dll/link/subsystem : windows : 위의 두 DLL은/MT 정적 링크를 사용하여 작동하지만/MD/D _AFXDLL을 사용하면 문제가 발생합니다. – adb

관련 문제