如何在JNA中映射枚举

Abd*_*liq 9 java enums native jna

我有以下枚举如何在jna中映射?

该枚举在结构中进一步引用.

typedef enum
{
 eFtUsbDeviceNotShared,
 eFtUsbDeviceSharedActive,
 eFtUsbDeviceSharedNotActive,
 eFtUsbDeviceSharedNotPlugged,
 eFtUsbDeviceSharedProblem
} eFtUsbDeviceStatus;
Run Code Online (Sandbox Code Playgroud)

阿卜杜勒·卡利克

Mar*_*iot 11

如果您正在使用JNA,则可能需要在Java中显式指定枚举的值.默认情况下,Java的基本枚举类型并不真正为您提供该功能,您必须为EnumSet添加构造函数(请参阅此内容此内容).

编码C枚举的一种简单方法是使用包含在与枚举同名的类中的public static final const int.您可以从Java枚举中获得大部分功能,但分配值的开销略小.

有一些很好的JNA例子,包括下面的代码片段(其被复制)都可以在这里.

假设你的C代码如下:

enum Values {
     First,
     Second,
     Last
};
Run Code Online (Sandbox Code Playgroud)

然后Java看起来像:

public static interface Values {
    public static final int First = 0;
    public static final int Second = 1;
    public static final int Last = 2;
}
Run Code Online (Sandbox Code Playgroud)


Dar*_*ien 7

在我的博客上,我写了一个方便的方法来使用真正的 Java enum与JNA,而不是任意ints.它有点复杂,但它有几个优点:

  • 您可以获得大多数类型安全和错误预防
  • 您的IDE可以建议/自动完成任务
  • 您可以创建更多类更简单的Java API

基本上,你需要使用自定义TypeConverterenum通过一个简单的,并提供给JNA TypeMapper.大多数额外的代码是为了避免需要TypeConverter为每个不同的enum类分开.(就我而言,我不得不做很多.)


你可以在我的jhllib项目中看到一些真实的代码.特别是,请查看HlTypeMapper,EnumConverterJnaEnum的定义和用法.