2009-07-21 11 views
8

Aşağıdaki enum'u jna'da nasıl eşleyebilirim? Bu enum ayrıca yapıda da belirtilmektedir.JMA enon eşleme nasıl yapılır?

typedef enum 
{ 
eFtUsbDeviceNotShared, 
eFtUsbDeviceSharedActive, 
eFtUsbDeviceSharedNotActive, 
eFtUsbDeviceSharedNotPlugged, 
eFtUsbDeviceSharedProblem 
} eFtUsbDeviceStatus; 

Abdul Khaliq

cevap

11

JNA kullanıyorsanız, muhtemelen Java'daki numaralandırma değerlerini açıkça belirtmek istersiniz. Varsayılan olarak, Java'nın temel enum türü size bu işlevi vermez, EnumSet için bir kurucu eklemeniz gerekir (bkz. this ve this).

C numaralandırmalarını kodlamak için basit bir yöntem, enum ile aynı ada sahip bir sınıfa sarılmış genel statik son const öğelerini kullanmaktır. Java enum'dan alacağınız işlevselliklerin çoğunu elde edersiniz, ancak değerleri atamak için biraz daha az masraf görürsünüz. Aşağıdaki snippet'ler dahil (kopyalanan) bazı iyi JNA örnekleri here kullanılabilir.

varsayalım gibi C kodu görünür:

public static interface Values { 
    public static final int First = 0; 
    public static final int Second = 1; 
    public static final int Last = 2; 
} 
0

bir enum için C arasında sözdizimi ++ ve Java çok fark yoktur.

enum eFtUsbDeviceStatus { 
    eFtUsbDeviceNotShared, 
    eFtUsbDeviceSharedActive, 
    eFtUsbDeviceSharedNotActive, 
    eFtUsbDeviceSharedNotPlugged, 
    eFtUsbDeviceSharedProblem 
} 

Bunu eFtUsbDeviceStatus olarak kullanabilirsiniz.

2

sizin yapısında bu enum başvuran, sadece int olarak ilan etmek istiyorum değil: gibi

enum Values { 
    First, 
    Second, 
    Last 
}; 

Sonra Java görünüyor eFtUsbDeviceStatus veya bunun gibi bir şey. benim ben a convenient way to use real Java enums with JNA yazdım blog, yerine sadece keyfi int s On

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); 
    } 
} 
7

: Örnek olarak aşağıda AcOnLineWake görüyoruz. Bu biraz daha karmaşık, ama birçok avantajı vardır: Sen

  • Kişisel IDE önerebilir tip güvenlik ve hatasız önlenmesi/içinde en almak otomatik tamamlama şeyler
  • Bir çok yapabilirsiniz

    • sınıf-ier ve daha kolay Java API

    Temel olarak, basit bir TypeMapper aracılığıyla JNA bu enum için özel bir TypeConverter kullanın ve sağlamanız gerekir. Ek kodun çoğu, her bir farklı enum sınıfı için ayrı bir TypeConverter yapmaktan kaçınmaktır. (Benim durumumda, ben onlardan bir sürü yapmak zorunda kaldı.)


    Sen benim jhllib projede bazı gerçek dünya kodunu görebilirsiniz. Özellikle, HlTypeMapper, EnumConverter ve JnaEnum'un tanımlarına ve kullanımlarına bakın.

  • İlgili konular