9
votes

Comment mapper Enum dans la JNA

J'ai l'énum suivant Comment puis-je mapper dans la JNA ??

Cet énorme est en outre référencé dans la structure. P>

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


0 commentaires

5 Réponses :


0
votes

Il n'y a pas beaucoup de différence de syntaxe entre C ++ et Java pour une énumération.

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


0 commentaires

12
votes

Si vous utilisez la JNA, vous voulez probablement préciser explicitement les valeurs de l'énumération en Java. Par défaut, le type de base de Java's Basic Enum ne vous donne pas vraiment cette fonctionnalité, vous devez ajouter un constructeur pour une énumulation (voir Ce et Ceci ).

Un moyen simple d'encoder C énumérations est d'utiliser la finale du Final Const de Final Statique public enveloppé dans une classe avec le même nom que l'énum. Vous obtenez la plupart des fonctionnalités que vous obtiendriez d'un Java Enum, mais légèrement moins de frais généraux pour affecter des valeurs. P>

Certains exemples de bonne JNA, y compris les extraits ci-dessous (qui ont été copiés) sont disponibles ici . p>

Supposons que votre code C ressemble à: p>

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


0 commentaires

2
votes

Lorsque vous référencez cet énumé dans votre structure, vous voulez simplement le déclarer comme un int, pas l'Eftusbdevicestatus ou quoi que ce soit comme ça. Comme exemple, voir Aconlinewake ci-dessous:

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


0 commentaires

8
votes

sur mon blog j'ai écrit Un moyen pratique d'utiliser réel Java Enum S avec JNA , plutôt que simplement arbitraire int s. C'est un peu plus complexe, mais il présente plusieurs avantages:

  • Vous obtenez la plupart de la sécurité et de la prévention des erreurs
  • Votre IDE peut suggérer / faire des choses autocompresses
  • Vous pouvez faire une API Java

    Fondamentalement, vous devez utiliser une personnalisée Typonverter pour le Enum et donnez-le à JNA via un simple Typemapper . La plupart du code supplémentaire consiste à ne pas avoir besoin de créer un distinct tyconverter pour chaque autre Enum classe. (Dans mon cas, je devais faire beaucoup d'entre eux.)


    Vous pouvez voir du code réel au monde dans mon Projet JHLLIB . En particulier, regardez les définitions et les utilisations de HLTyPeMapper , Enumconverter et Jnaenum .


1 commentaires

Merci beaucoup pour votre solution. Il semble que seul le code suivant au début de la principale: ((W32APITYPEMAPPER) W32APITYPEMAPPER.DEFAULT) .AddtyPeConverter (Enum.class, Nouveau Typonverter () {Objet public Fromnative (Object Nativevalue, Fromnativecontext Contexte) {retour contextuel.gettType ( ) .getenumConstants () [(entier) natifvalue];} Classe publique NativeType () {retour Integer.class;} Tonative entier public (valeur d'objet, Tonativecontext Contexte) {retour null == valeur? -1: ( Enum ) Valeur). Organinal ();}});



0
votes

JNA comprend désormais un Enumconverter .


0 commentaires