2009-07-21 8 views
8

में enum को कैसे मैप करें I have निम्नलिखित enum मैं jna में कैसे मैप करूं ??जेएनए

इस enum संरचना में आगे संदर्भित है।

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

अब्दुल खालिक

उत्तर

11

यदि आप जेएनए का उपयोग कर रहे हैं तो आप शायद जावा में गणना के मूल्यों को स्पष्ट रूप से निर्दिष्ट करना चाहते हैं। डिफ़ॉल्ट रूप से, जावा का मूल enum प्रकार वास्तव में आपको वह कार्यक्षमता नहीं देता है, आपको EnumSet के लिए एक कन्स्ट्रक्टर जोड़ना होगा (this और this देखें)।

सी गणनाओं को एन्कोड करने का एक आसान तरीका एनम के समान नाम वाले वर्ग में लिपटे सार्वजनिक स्थैतिक अंतिम स्थिरांक का उपयोग करना है। आपको जावा एनम से प्राप्त होने वाली अधिकांश कार्यक्षमता मिलती है लेकिन मूल्यों को असाइन करने के लिए थोड़ा कम ओवरहेड मिलता है।

कुछ अच्छे जेएनए उदाहरण, जिनमें नीचे स्निपेट शामिल हैं (जिन्हें कॉपी किया गया था) here उपलब्ध हैं।

मान लीजिए कि आपके सी कोड लगता है:

enum Values { 
    First, 
    Second, 
    Last 
}; 

फिर जावा लगता है:

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

वहाँ एक enum के लिए सेल्सियस के बीच वाक्य रचना ++ और Java में ज्यादा अंतर नहीं है।

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

आप इसे eFtUsbDeviceStatus के रूप में संदर्भित कर सकते हैं।

2

जब आपके संरचना में इस enum संदर्भित, तो आप सिर्फ एक पूर्णांक के रूप में यह घोषणा करने के लिए चाहते हैं, नहीं eFtUsbDeviceStatus या ऐसा कुछ भी। एक उदाहरण के रूप में नीचे 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); 
    } 
} 
7

मेरे ब्लॉग मैं a convenient way to use real Java enums with JNA लिखा है, बजाय सिर्फ मनमाना int रों पर। यह थोड़ा और अधिक जटिल है, लेकिन यह कई फायदे हैं:

  • आप मिल प्रकार- सुरक्षा और त्रुटि निवारण
  • आपका आईडीई सुझाव दे सकते हैं/के सबसे स्वत: पूर्ण बातें
  • आप एक बहुत बना सकते हैं वर्ग-ier और आसान जावा एपीआई

मूल रूप से, आप एक सरल TypeMapper के माध्यम से JNA को enum के लिए एक कस्टम TypeConverter उपयोग करें, और प्रदान करने के लिए है कि जरूरत है। प्रत्येक अतिरिक्त कोड कक्षा के लिए अलग TypeConverter बनाने की आवश्यकता से बचने के लिए है। (मेरे मामले में, मैं उनमें से एक बहुत कुछ करना था।)


तुम मेरे jhllib परियोजना में कुछ वास्तविक दुनिया कोड देख सकते हैं। विशेष रूप से, HlTypeMapper, EnumConverter, और JnaEnum की परिभाषाओं और उपयोगों को देखें।

संबंधित मुद्दे