2017-12-13 9 views
1

또 다른 "할 수 없다"질문 :Windows에서 loadLibrary()에 대한 Java 프로세스의 "경로"를 수정할 수 있습니까?

나는 32 비트 또는 64 비트 중 하나를 빌드 할 수있는 Java 응용 프로그램이 있습니다. 동일한 머신에서 두 버전을 빌드하고 테스트하고 싶습니다.

두 개의 디렉토리에 빌드되고 출력되는 (실제로는 DLL 집합)로드해야하는 기본 라이브러리가 있습니다.

.../64/.DLL .../X32/ .DLL

는 "..."일부 자바 "java.library.path"

에 설정된 응용 프로그램 시작의 코드는 않습니다 : 32 비트 라이브러리를로드하는 프로그램이 자바 64 비트를 컴파일 할 때 실패하고 그 다음 64 비트 버전을 시도하기 때문에

try { 
     System.loadLibrary("x32/native-library"); 
     libraryLoaded_ = true; 
    } catch(Throwable e) { 
     try { 
      System.loadLibrary("x64/native-library"); 
      libraryLoaded_ = true; 
     } catch(Throwable t) { 
      log.debug("failed to load module " + e); // : \"" + path + "\".",e); 
      log.debug(" or win8 module " + t); // : \"" + path + "\".",e); 
     } 
    } 

이 (부분적으로) 작동합니다.

그러나 native-library.dll은 자체와 동일한 폴더에있는 다른 DLL에 종속되어 있지만 java 프로세스의 시스템 경로 환경 변수에있는 해당 디렉토리가 아니라면 해결되지 않습니다.

그러나 x32 및 x64 디렉터리가 모두 시스템 경로에 있고 둘 다 같은 이름을 가진 경우 종속 DLL이로드되는 모호성이 있습니다.

나는 그것이 거주. 나는이 작업을 수행 할 수있는 방법을

있는 폴더에서 첫 번째 종속의로드 네이티브 library.dll을 갖고 싶어

? java.library.path는 명시 적으로로드되는 라이브러리의 종속 dll로드에 영향을 미치지 않는 것 같습니다.

"loadLibrary"를 호출하기 전에 네이티브 라이브러리의 위치를 ​​포함하도록 Java 응용 프로그램의 프로세스에서 경로를 수정해야합니다.

앱 코드에서이 작업을 수행 할 수 있습니까? loadLibrary에 의해로드 된 DLL을 만드는 방법이 있습니까? 프로세스의 경로 요소를 검색하기 전에 먼저 폴더에서 의존성을로드하십시오.

답변

0
  • 는 일반적으로, 당신은 JVM 시작 후 "java.library.path"를 변경할 수 없습니다 (일부 dirty tricks이 할가 그 반사를 사용하지만 더 나은되지 않음).
  • String archDataModel = System.getProperty("sun.arch.data.model");을 사용하여 JVM이 32 비트 또는 64 비트인지 확인할 수 있습니다.
  • 수정 된 findLibrary 메서드가있는 사용자 지정 ClassLoader을 사용하여 라이브러리를 올바른 위치에서로드 할 수 있습니다. 그러나이 방법은로드 된 라이브러리 자체에 대해서만 경로를 지정하지만 종속성에 대해서는 지정하지 않습니다. PATH 환경 변수를 변경하거나 현재 디렉토리를 변경하여 종속성을 변경할 수 있습니다.