문제

다음 열거가 있습니다. 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;
}

다른 팁

내 블로그에서 나는 썼다 편리한 사용 방법 진짜 자바 enumJNA와 함께, 단지 임의적이기보다는 int에스. 조금 더 복잡하지만 몇 가지 장점이 있습니다.

  • 당신은 얻습니다 대부분 유형 안전성 및 오류 예방
  • 당신의 IDE는 제안/자동 완성을 제안 할 수 있습니다
  • 당신은 훨씬 더 클래스어와 더 쉬운 Java API를 만들 수 있습니다.

기본적으로 사용자 정의를 사용해야합니다 TypeConverterenum, 간단한 것을 통해 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로 참조 할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top