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;
5 Réponses :
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 }
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; }
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); } }
sur mon blog j'ai écrit Un moyen pratique d'utiliser réel strong> Java Fondamentalement, vous devez utiliser une personnalisée Vous pouvez voir du code réel au monde dans mon Projet JHLLIB . En particulier, regardez les définitions et les utilisations de HLTyPeMapper A >, Enumconverter et Jnaenum . P> Enum code> S avec JNA
, plutôt que simplement arbitraire int code> s. C'est un peu plus complexe, mais il présente plusieurs avantages: P>
Typonverter Code>
pour le Enum code> et donnez-le à JNA via un simple
Typemapper code>
. La plupart du code supplémentaire consiste à ne pas avoir besoin de créer un distinct tyconverter code> pour chaque autre
Enum code> classe. (Dans mon cas, je devais faire beaucoup d'entre eux.) P>
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 ();}});