문제
다음 열거가 있습니다. JNA에서 어떻게 매핑합니까 ??
이 열거는 구조에서 추가로 참조됩니다.
typedef enum
{
eFtUsbDeviceNotShared,
eFtUsbDeviceSharedActive,
eFtUsbDeviceSharedNotActive,
eFtUsbDeviceSharedNotPlugged,
eFtUsbDeviceSharedProblem
} eFtUsbDeviceStatus;
압둘 칼리 크
해결책
JNA를 사용하는 경우 Java의 열거 값을 명시 적으로 지정하려고합니다. 기본적으로 Java의 기본 열거 유형은 실제로 해당 기능을 제공하지 않으므로 열거를 위해 생성자를 추가해야합니다 ( 이것 그리고 이것).
C 열거를 인코딩하는 간단한 방법은 열거와 동일한 이름의 클래스에 래핑 된 공개 정적 최종 Const INT를 사용하는 것입니다. Java 열거에서 얻을 수있는 대부분의 기능을 얻지 만 값을 할당하기 위해 약간 덜 오버 헤드를 얻습니다.
아래의 스 니펫 (복사 된)을 포함한 일부 좋은 JNA 예제를 사용할 수 있습니다. 여기.
C 코드가 다음과 같습니다.
enum Values {
First,
Second,
Last
};
그런 다음 Java는 다음과 같습니다.
public static interface Values {
public static final int First = 0;
public static final int Second = 1;
public static final int Last = 2;
}
다른 팁
내 블로그에서 나는 썼다 편리한 사용 방법 진짜 자바 enum
JNA와 함께, 단지 임의적이기보다는 int
에스. 조금 더 복잡하지만 몇 가지 장점이 있습니다.
- 당신은 얻습니다 대부분 유형 안전성 및 오류 예방
- 당신의 IDE는 제안/자동 완성을 제안 할 수 있습니다
- 당신은 훨씬 더 클래스어와 더 쉬운 Java API를 만들 수 있습니다.
기본적으로 사용자 정의를 사용해야합니다 TypeConverter
용 enum
, 간단한 것을 통해 JNA에 그것을 제공하십시오 TypeMapper
. 추가 코드의 대부분은 별도의 것을 만들 필요가없는 것입니다. TypeConverter
각각 다른 것에 대해 enum
수업. (제 경우에는 많은 것을 만들어야했습니다.)
내에서 실제 코드를 볼 수 있습니다 jhllib 프로젝트. 특히,의 정의와 사용법을 살펴보십시오. hltypemapper, EnumConverter, 그리고 Jnaenum.
구조 에서이 열거를 참조 할 때, 당신은 그것을 eftusbdevicestatus가 아닌 int로 선언하고 싶습니다. 예를 들어 아래 Aconlinewake를 참조하십시오.
import com.sun.jna.Native;
import com.sun.jna.Structure;
import com.sun.jna.win32.StdCallLibrary;
public class JNAPlayground
{
public interface PowrProf extends StdCallLibrary
{
PowrProf INSTANCE = (PowrProf) Native.loadLibrary(
"C:\\WINDOWS\\system32\\PowrProf.dll", PowrProf.class);
/*
typedef struct {
ULONG Granularity;
ULONG Capacity;
}BATTERY_REPORTING_SCALE, *PBATTERY_REPORTING_SCALE; */
public static class BATTERY_REPORTING_SCALE extends Structure
{
public long Granularity;
public long Capacity;
}
/*
typedef struct {
BOOLEAN PowerButtonPresent;
BOOLEAN SleepButtonPresent;
BOOLEAN LidPresent;
BOOLEAN SystemS1;
BOOLEAN SystemS2;
BOOLEAN SystemS3;
BOOLEAN SystemS4;
BOOLEAN SystemS5;
BOOLEAN HiberFilePresent;
BOOLEAN FullWake;
BOOLEAN VideoDimPresent;
BOOLEAN ApmPresent;
BOOLEAN UpsPresent;
BOOLEAN ThermalControl;
BOOLEAN ProcessorThrottle;
BYTE ProcessorMinThrottle;
BYTE ProcessorMaxThrottle;
BOOLEAN FastSystemS4;
BYTE spare2[3];
BOOLEAN DiskSpinDown;
BYTE spare3[8];
BOOLEAN SystemBatteriesPresent;
BOOLEAN BatteriesAreShortTerm;
BATTERY_REPORTING_SCALE BatteryScale[3];
SYSTEM_POWER_STATE AcOnLineWake; // enum
SYSTEM_POWER_STATE SoftLidWake;
SYSTEM_POWER_STATE RtcWake;
SYSTEM_POWER_STATE MinDeviceWakeState;
SYSTEM_POWER_STATE DefaultLowLatencyWake;
}SYSTEM_POWER_CAPABILITIES, *PSYSTEM_POWER_CAPABILITIES;
*/
public static class SYSTEM_POWER_CAPABILITIES extends Structure
{
public boolean PowerButtonPresent;
public boolean SleepButtonPresent;
public boolean LidPresent;
public boolean SystemS1;
public boolean SystemS2;
public boolean SystemS3;
public boolean SystemS4;
public boolean SystemS5;
public boolean HiberFilePresent;
public boolean FullWake;
public boolean VideoDimPresent;
public boolean ApmPresent;
public boolean UpsPresent;
public boolean ThermalControl;
public boolean ProcessorThrottle;
public int ProcessorMinThrottle;
public int ProcessorMaxThrottle;
public boolean FastSystemS4;
public int spare2[] = new int[3];
public boolean DiskSpinDown;
public int spare3[] = new int[8];
public boolean SystemBatteriesPresent;
public boolean BatteriesAreShortTerm;
public BATTERY_REPORTING_SCALE BatteryScale[] = new BATTERY_REPORTING_SCALE[3];
public int AcOnLineWake;
public int SoftLidWake;
public int RtcWake;
public int MinDeviceWakeState;
public int DefaultLowLatencyWake;
}
// http://msdn.microsoft.com/en-us/library/aa372691(VS.85).aspx
void GetPwrCapabilities( SYSTEM_POWER_CAPABILITIES result );
}
public static void main( String[] args )
{
PowrProf lib2 = PowrProf.INSTANCE;
PowrProf.SYSTEM_POWER_CAPABILITIES systemPOWERCAPABILITIES = new PowrProf.SYSTEM_POWER_CAPABILITIES();
lib2.GetPwrCapabilities(systemPOWERCAPABILITIES);
System.out.println("Lid present:" + systemPOWERCAPABILITIES.LidPresent);
}
}
열거에 대한 C ++와 Java 간의 구문에는 별다른 차이가 없습니다.
enum eFtUsbDeviceStatus {
eFtUsbDeviceNotShared,
eFtUsbDeviceSharedActive,
eFtUsbDeviceSharedNotActive,
eFtUsbDeviceSharedNotPlugged,
eFtUsbDeviceSharedProblem
}
eftusbdevicestatus로 참조 할 수 있습니다.