9

私は次の列挙型を持っていますjnaでどのようにマップしますか?

この列挙型は、構造体でさらに参照されます。

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

アブドゥル・ハリク

4

5 に答える 5

12

JNA を使用している場合は、Java で列挙型の値を明示的に指定することをお勧めします。デフォルトでは、Java の基本的な列挙型は実際にはその機能を提供しません。EnumSet のコンストラクターを追加する必要があります (これこれを参照してください)。

C 列挙型をエンコードする簡単な方法は、列挙型と同じ名前のクラスにラップされた public static final const int を使用することです。Java 列挙型から得られるほとんどの機能を利用できますが、値を割り当てるためのオーバーヘッドがわずかに少なくなります。

以下のスニペット (コピーされたもの) を含むいくつかの良い JNA の例は、こちらから入手できます。

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;
}
于 2009-08-31T18:40:05.817 に答える
8

私のブログでは、任意のJavaではなく、JNAで実際のJavaを使用する便利な方法を作成しenumintました。少し複雑ですが、いくつかの利点があります。

  • あなたはほとんどの型安全性とエラー防止を手に入れます
  • IDEは物事を提案/オートコンプリートできます
  • よりクラスが高く、より簡単なJavaAPIを作成できます

基本的に、のカスタムを使用し、それを単純なを介してJNAに提供する必要がTypeConverterありenumますTypeMapper。余分なコードのほとんどは、異なるクラスTypeConverterごとに個別に作成する必要がないようにするためのものです。enum(私の場合、たくさん作らなければなりませんでした。)


私のjhllibプロジェクトで実際のコードを見ることができます。特に、HlTypeMapperEnumConverter、およびJnaEnumの定義と使用法を確認してください。

于 2010-12-03T00:44:47.473 に答える
2

構造体でこの列挙型を参照するときは、eFtUsbDeviceStatusなどではなく、intとして宣言するだけです。例として、以下の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);
    }
}
于 2010-03-10T19:44:42.717 に答える
0

列挙型の場合、C++ と Java の間で構文に大きな違いはありません。

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

これは eFtUsbDeviceStatus として参照できます。

于 2009-07-31T03:48:13.720 に答える