質問
私は、以下の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;
}
他のヒント
ブログに書きました 便利な使い方 本物 ジャワ enum
JNAとの, 、単なる恣意的なものではなく int
s.これは少し複雑ですが、いくつかの利点があります。
- あなたは得ます ほとんど タイプセーフティとエラー防止の
- 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としてそれを参照することができます。