سؤال

لدي enum كيف يمكنني الخريطة في JNA؟

يتم الرجوع إلى هذا العادة في الهيكل.

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

عبد الخالق

هل كانت مفيدة؟

المحلول

إذا كنت تستخدم JNA، فربما تريد تحديد قيم التعداد بشكل صريح بشكل صريح في Java. افتراضيا، لا يمنحك نوع Enum الأساسي Java حقا هذه الوظيفة، يجب عليك إضافة منشئ لحمل (انظر هذه و هذه).

طريقة بسيطة لتشفير تعداد C هي استخدام نهائي ثابت عام Const Ints ملفوفة في فئة بنفس الاسم مثل ENUM. تحصل على معظم الوظائف التي تحصل عليها من Java Enum ولكنها أقل قليلا من النفقات العامة لتعيين القيم.

بعض أمثلة الإرهاب الجيد، بما في ذلك القصاصات أدناه (التي تم نسخها) متوفرة هنا.

لنفترض أن رمز C الخاص بك يشبه:

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

نصائح أخرى

على مدونتي كتبت طريقة مريحة للاستخدام حقيقة جاوة enumق مع jna., ، بدلا من مجرد تعسفي intس. إنه أكثر تعقيدا قليلا، لكن لديه العديد من المزايا:

  • لقد حصلت عظم من السلامة من النوع والوقاية من الأخطاء
  • يمكن أن يقترح IDE الخاص بك / التلقائي الأشياء
  • يمكنك إجراء الكثير من الفئة IER وأسهل Java API

أساسا، تحتاج إلى استخدام مخصص TypeConverter ل enum, ، وتوفير ذلك إلى jna من خلال بسيطة TypeMapper. وبعد معظم الكود الإضافي هو تجنب الحاجة إلى جعل منفصلة TypeConverter لكل يختلف enum صف دراسي. (في حالتي، اضطررت إلى جعل الكثير منهم.)


يمكنك أن ترى بعض الكود العالمي الحقيقي في بلدي jhllib المشروع. على وجه الخصوص، انظر إلى التعاريف والأشجار hltypemapper., enumconverter., ، و jnaenum.

عند الرجوع إلى هذا العادة في هيكلك، فأنت تريد فقط أن تعلن أنها كثيرة، وليس EFTUSBDEVISTATUS أو أي شيء من هذا القبيل. كمثال يرى 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