如何在 JNA 中映射枚举
我有以下枚举如何在 jna 中映射?
该枚举在结构中被进一步引用。
typedef enum
{
eFtUsbDeviceNotShared,
eFtUsbDeviceSharedActive,
eFtUsbDeviceSharedNotActive,
eFtUsbDeviceSharedNotPlugged,
eFtUsbDeviceSharedProblem
} eFtUsbDeviceStatus;
阿卜杜勒·哈利克
I have the following enum how do i map in jna ??
This enum is further referenced in structure.
typedef enum
{
eFtUsbDeviceNotShared,
eFtUsbDeviceSharedActive,
eFtUsbDeviceSharedNotActive,
eFtUsbDeviceSharedNotPlugged,
eFtUsbDeviceSharedProblem
} eFtUsbDeviceStatus;
Abdul Khaliq
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
JNA 现在包含 枚举转换器。
JNA now includes an EnumConverter.
C++ 和 Java 中枚举的语法没有太大区别。
您可以将其引用为 eFtUsbDeviceStatus。
There is not much difference in syntax between C++ and Java for an enum.
You can reference it as eFtUsbDeviceStatus.
在结构中引用此枚举时,您只想将其声明为 int,而不是 eFtUsbDeviceStatus 或类似的内容。 作为示例,请参见下面的 AcOnLineWake:
When referencing this enum in your structure, you just want to declare it as an int, not eFtUsbDeviceStatus or anything like that. As an example see AcOnLineWake below:
在我的博客上,我写了一种使用real Java
enum<的便捷方法/code> 与 JNA
,而不仅仅是任意
int
。 它有点复杂,但它有几个优点:基本上,您需要使用自定义
TypeConverter
< /a> 用于enum
,并通过简单的TypeMapper
。 大多数额外代码是为了避免需要为每个不同的enum
类创建单独的TypeConverter
。 (就我而言,我必须制作很多。)您可以在我的 jhllib< 中看到一些真实世界的代码/a> 项目。 特别是查看 HlTypeMapper< 的定义和用法/a>、EnumConverter 和 < a href="https://github.com/DHager/jhllib/search?utf8=%E2%9C%93&q=JnaEnum" rel="nofollow">JnaEnum。
On my blog I wrote up a convenient way to use real Java
enum
s with JNA, rather than just arbitraryint
s. It's a bit more complex, but it has several advantages:Basically, you need to use a custom
TypeConverter
for theenum
, and provide that to JNA through a simpleTypeMapper
. Most of the extra code is to avoid needing to make a separateTypeConverter
for each differentenum
class. (In my case, I had to make a lot of them.)You can see some real-world code in my jhllib project. In particular, look at the definitions and usages of HlTypeMapper, EnumConverter, and JnaEnum.
如果您使用 JNA,您可能希望在 Java 中显式指定枚举的值。 默认情况下,Java 的基本枚举类型并没有真正为您提供该功能,您必须为 EnumSet 添加构造函数(请参阅 这个 和 这个)。
对 C 枚举进行编码的一种简单方法是使用包装在与枚举同名的类中的 public static final const int。 您可以获得从 Java 枚举获得的大部分功能,但分配值的开销会稍微少一些。
此处提供了一些不错的 JNA 示例,包括下面的代码片段(已复制) 。
假设您的 C 代码如下所示:
那么 Java 代码如下所示:
If you're using JNA you probably want to explicitly specify the values of the enumeration in Java. By default, Java's basic enum type doesn't really give you that functionality, you have to add a constructor for an EnumSet (see this and this).
A simple way to encode C enumerations is to use public static final const ints wrapped in a class with the same name as the enum. You get most of the functionality you'd get from a Java enum but slightly less overhead to assign values.
Some good JNA examples, including the snippets below (which were copied) are available here.
Suppose your C code looks like:
Then the Java looks like: