質問

私は、以下のenumですか?図jna??

このenumは、さらに参照します。

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

アブドゥルKhaliq

役に立ちましたか?

解決

使用している場合は、JNAだ明示的に指定の値の列挙Java.デフォルトでは、Javaの基本的な列挙型んとする機能を追加するコンストラクタは、EnumSet参照 このこの).

簡単にエンコードCの列挙はでは、public static final int定数に包まれたクラスと同じ名前のクラスとしてenum.きものの機能をいからJavaの列挙型が弱のオーバーヘッドに割り当て数値です。

いくつかの良いJNA例を含め、スニペットを下したコピー) こちらの.

Dir Cコードを次のように記述されています。

enum Values {
     First,
     Second,
     Last
};

その後、Java次のように記述されています。

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

他のヒント

ブログに書きました 便利な使い方 本物 ジャワ enumJNAとの, 、単なる恣意的なものではなく ints.これは少し複雑ですが、いくつかの利点があります。

  • あなたは得ます ほとんど タイプセーフティとエラー防止の
  • IDE は何かを提案したりオートコンプリートしたりできます
  • より高級で簡単な Java API を作成できます

基本的にはカスタムを使用する必要があります TypeConverter のために enum, 、そしてそれを簡単な方法で JNA に提供します。 TypeMapper. 。追加のコードのほとんどは、別個のコードを作成する必要を避けるためのものです。 TypeConverter それぞれ異なる enum クラス。(私の場合は大量に作る必要がありました。)


私の実際のコードをいくつか見ることができます jhllib プロジェクト。特に、の定義と使用法を見てください。 HlTypeMapper, 列挙コンバータ, 、 そして JnaEnum.

あなたの構造内でこの列挙型を参照する場合、

、あなただけのint型ではなく、eFtUsbDeviceStatusか、そのようなものとして、それを宣言したいです。

:一例として、以下の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