2009-07-21 8 views
8

J'ai l'enum suivant comment puis-je mapper dans jna ??Comment faire pour mapper enum dans JNA

Cette énumération est également référencée dans la structure.

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

Abdul Khaliq

Répondre

11

Si vous utilisez JNA, vous souhaitez probablement spécifier explicitement les valeurs de l'énumération dans Java. Par défaut, le type enum de base de Java ne vous donne pas vraiment cette fonctionnalité, vous devez ajouter un constructeur pour un EnumSet (voir this et this).

Un moyen simple de coder les énumérations C consiste à utiliser des constantes finales publiques statiques enveloppées dans une classe portant le même nom que l'énumération. Vous obtenez la plupart des fonctionnalités que vous obtiendriez d'une énumération de Java mais légèrement moins de temps pour assigner des valeurs.

Certains bons exemples JNA, y compris les extraits ci-dessous (qui ont été copiés) sont disponibles here.

Supposons que votre code C ressemble à:

enum Values { 
    First, 
    Second, 
    Last 
}; 

Java ressemble alors:

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

Il n'y a pas beaucoup de différence dans la syntaxe entre C++ et Java pour un ENUM.

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

Vous pouvez le référencer comme eFtUsbDeviceStatus.

2

Lorsque vous faites référence ce ENUM dans votre structure, vous voulez juste de le déclarer comme un entier, non eFtUsbDeviceStatus ou quelque chose comme ça. A titre d'exemple, voir ci-dessous 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

Sur mon blog, j'ai écrit a convenient way to use real Java enums with JNA, int plutôt que seulement arbitraire s. Il est un peu plus complexe, mais il présente plusieurs avantages:

  • Vous obtenez plus du type sécurité et la prévention des erreurs
  • Votre IDE peut suggérer/choses autocomplete
  • Vous pouvez faire beaucoup classe ier et plus facile API Java

Fondamentalement, vous devez utiliser une coutume TypeConverter pour le enum, et prévoient que la JNA par un TypeMapper simple. La plupart du code supplémentaire est d'éviter de devoir créer un TypeConverter distinct pour chaque classe enum différente. (Dans mon cas, je devais faire beaucoup d'entre eux.)


Vous pouvez voir le code monde réel dans mon projet jhllib. En particulier, regardez les définitions et les utilisations de HlTypeMapper, EnumConverter, et JnaEnum.

Questions connexes