在保留本机 typedef class 的同时在 JNA 中映射原始类型
Mapping primitive type in JNA while keeping the native typedef class
我在我的 DLL 中定义了这个类型:
typedef int FMOD_MEMORY_TYPE;
我可以在 Java 中为此制作一个 class 以便我知道 FMOD_MEMORY_TYPE
只是一个 int
吗?
public final class FMOD_MEMORY_TYPE {
public int value;
}
我猜它占用相同数量的内存?
这种类型经常被传递到函数中,如果在 Java 中它几乎也有自己的 typedef,它会变得容易得多。如果没有,我怎样才能映射到 Java 中的类型?
本质上它只是一个 int
,但必须用 int
替换所有出现的地方会花费很多时间,而且这会更容易。
基本上我希望能够像这样映射代码:
(三):
void some_function(FMOD_MEMORY_TYPE argument);
<=> Java:
public void some_function(FMOD_MEMORY_TYPE arg);
而不是:
public void some_function(int arg);
是的,您可以为原语创建一个包装器 class,但并不像您描述的那么简单。
包装器 class 让您可以轻松地按照您的要求移植代码,并确保类型安全。 class 将在 Java 端占用更多内存,因为您正在为整个对象分配 space 而不是简单地为基元分配内存。并且存储和检索内部值的性能会受到微小影响。但是,如果这些 trade-offs 对您来说是值得的并且没有在 performance-sensitive 应用程序中使用,那不是问题。
但是,您不能像您在问题中描述的那样只使用 class 而不为 JNA 添加额外的功能来确定对象的字节大小及其相应的本机等效项。具体来说,您必须实现 NativeMapped
接口。这最容易通过扩展现有的 JNA class 来完成,它已经为您完成了这项工作。
对于整数 typedef,我建议您创建一个扩展 IntegerType
的类型并提供对这些方法的访问。所以在你的情况下,我会这样做:
public final class FMOD_MEMORY_TYPE extends IntegerType {
public static final int SIZE = 4; // bytes
public FMOD_MEMORY_TYPE() {
this(0);
}
public FMOD_MEMORY_TYPE(int value) {
super(SIZE, value);
}
}
这样做将从 IntegerType
继承 setValue()
并继承所有核心 Java Number class 方法,如 intValue()
。
您也可以选择实施 Comparable
或根据需要添加其他方法。
JNA WinDef class 中有很多例子。
我在我的 DLL 中定义了这个类型:
typedef int FMOD_MEMORY_TYPE;
我可以在 Java 中为此制作一个 class 以便我知道 FMOD_MEMORY_TYPE
只是一个 int
吗?
public final class FMOD_MEMORY_TYPE {
public int value;
}
我猜它占用相同数量的内存?
这种类型经常被传递到函数中,如果在 Java 中它几乎也有自己的 typedef,它会变得容易得多。如果没有,我怎样才能映射到 Java 中的类型?
本质上它只是一个 int
,但必须用 int
替换所有出现的地方会花费很多时间,而且这会更容易。
基本上我希望能够像这样映射代码: (三):
void some_function(FMOD_MEMORY_TYPE argument);
<=> Java:
public void some_function(FMOD_MEMORY_TYPE arg);
而不是:
public void some_function(int arg);
是的,您可以为原语创建一个包装器 class,但并不像您描述的那么简单。
包装器 class 让您可以轻松地按照您的要求移植代码,并确保类型安全。 class 将在 Java 端占用更多内存,因为您正在为整个对象分配 space 而不是简单地为基元分配内存。并且存储和检索内部值的性能会受到微小影响。但是,如果这些 trade-offs 对您来说是值得的并且没有在 performance-sensitive 应用程序中使用,那不是问题。
但是,您不能像您在问题中描述的那样只使用 class 而不为 JNA 添加额外的功能来确定对象的字节大小及其相应的本机等效项。具体来说,您必须实现 NativeMapped
接口。这最容易通过扩展现有的 JNA class 来完成,它已经为您完成了这项工作。
对于整数 typedef,我建议您创建一个扩展 IntegerType
的类型并提供对这些方法的访问。所以在你的情况下,我会这样做:
public final class FMOD_MEMORY_TYPE extends IntegerType {
public static final int SIZE = 4; // bytes
public FMOD_MEMORY_TYPE() {
this(0);
}
public FMOD_MEMORY_TYPE(int value) {
super(SIZE, value);
}
}
这样做将从 IntegerType
继承 setValue()
并继承所有核心 Java Number class 方法,如 intValue()
。
您也可以选择实施 Comparable
或根据需要添加其他方法。
JNA WinDef class 中有很多例子。