2011-03-27 3 views
3

에서 가능한 중복 : 내 자바 응용 프로그램에서
Java : switching between dll depends on system architecture (32/64)로드 32 또는 64 비트 JNI 라이브러리 자바

내가 32 비트 및 64 비트 사용할 수있는 JNI 라이브러리가 필요합니다. 두 개의 서로 다른 버전의 응용 프로그램을 제공하고 싶지 않으므로 두 라이브러리로 응용 프로그램을 제공하려면 응용 프로그램이로드 할 라이브러리 (foobar32.so 또는 foobar64.so)를 결정해야합니다. 어떻게해야합니까?

첫 번째를로드하려고 시도했는데이 예외가 발생하면 두 번째로드가 발생하지만 추한 것처럼 들립니다.

대신 32 비트 Java 또는 64 비트 Java를 사용하여 응용 프로그램을 실행하는지 확인할 수있는 시스템 속성이 있습니까? 일부 os.arch 속성을 알고 있지만 반환 값은 this answer에 따라 예측할 수없는 것으로 보입니다.

그렇다면 32 비트 또는 64 비트 JNI 라이브러리를로드할지 여부를 응용 프로그램이 결정하도록하는 가장 좋은 방법은 무엇입니까?

+0

신청서를 번들하는 방법은 무엇입니까? OSGi에서는 OS 아키텍처에 따라 특정 번들이나 번들 조각 만로드 할 수 있습니다. 플랫폼 별 기능이 제공되는 방식입니다. OSGi 사용을 고려해 주시겠습니까? – katsharp

+0

당신의 주된 관심사는 OS가 아니라 실행 파일입니다 : 64 비트 OS에서 32 비트 실행 파일을 실행할 수 있지만 여전히 32 비트이고 필요한 라이브러리는 64가 아닌 32 비트입니다. 가상의 경우 32 비트에서 64 비트 실행 파일을 실행할 수 있습니다 OS를 사용하려면 64 비트 라이브러리가 필요합니다. 이것은 przemelek가 설명하려고 시도하는 것입니다. 'os.arch'는 현재 존재하는 한 실질적으로 아무 것도 쓸만합니다. 내 대답은 Unsafe가있을 것이지만 일부 시스템 속성은 그렇지 않을 수도 있습니다. – bestsss

답변

5

왜 예측할 수 없습니까? 당신은 그것이 32 비트 시스템인지를 알아 내고 싶습니다.이 경우 x86 (물론 x86 프로세서의 경우)이 항상 64 비트가됩니다.

PPC 또는 다른 비 x86 프로세서에서도 코드가 실행될 수 있다는 것을 알고 있으면 문제가 시작됩니다. 그러나이 경우에는 예외적 인 흐름 제어로 추한 해킹을 사용하고 try {} catch()를 사용하여 그러한 상황을 "감지"할 수 있습니다.

IMHO os.arch가 최상의 솔루션입니다.

+0

@przemelek -'os.arch'는 jar 컴파일에 사용되는 시스템의 속성을 반환하기 때문에 신뢰할 수 없습니다. (내 대답의 링크 참조) – MByD

+1

@MByD : 아니요, 시스템 속성은' os.arch' --- 모든 Java 시스템 속성 ---은 컴파일 타임 개념이 아니라 런타임 개념입니다. 따라서 런타임 아키텍처를 반환합니다. – jmg

+0

@jmg. 제가 실수를. 'os.arch'의 반환 값은 런타임 값이지만 실제 아키텍처가 아닌 JRE의 비트 니스에 의존하므로 64 비트 Windows 시스템에서 32 비트 JRE를 실행하면'x86'을 다음과 같이 얻을 수 있습니다. 결과. 이 게시물을 참조하십시오 : http://mark.koli.ch/2009/10/javas-osarch-system-property-is-the-bitness-of-the-jre-not-the-operating-system.html – MByD

0

Unsafe.addressSize();

보고서 {@link #putAddress}를 통해 저장된 원시 포인터의 크기 (바이트). 이 값은 4 또는 8이됩니다.

여기에서 가져올 수 있습니다.

+0

_sun.misc.Unsafe_를 의미하는 경우 다른 Java 구현에서 제공하지 않기 때문에 사용하기에 좋지 않습니다. – kayahr

+0

@kayahr, Unsafe가없는 Java 버전에서 작동하는 기본 libs를 가질 확률은 거의 없습니다. – bestsss

관련 문제