كيفية تعيين Enum في jna
سؤال
لدي 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.