Java 在JNA中映射基元类型,同时保留本机typedef类
我在DLL中定义了此类型:Java 在JNA中映射基元类型,同时保留本机typedef类,java,jna,Java,Jna,我在DLL中定义了此类型: typedef int FMOD_MEMORY_TYPE; 我可以用Java为它创建一个类,这样我就知道FMOD\u MEMORY\u TYPE只是一个int public final class FMOD_MEMORY_TYPE { public int value; } 我想它需要同样的记忆量 这种类型被大量地传递到函数中,如果在Java中也有自己的typedef,它将变得更加容易。如果不是,我如何在Java中映射到某个类型 本质上,它只是一个int,
typedef int FMOD_MEMORY_TYPE;
我可以用Java为它创建一个类,这样我就知道FMOD\u MEMORY\u TYPE
只是一个int
public final class FMOD_MEMORY_TYPE {
public int value;
}
我想它需要同样的记忆量
这种类型被大量地传递到函数中,如果在Java中也有自己的typedef,它将变得更加容易。如果不是,我如何在Java中映射到某个类型
本质上,它只是一个int
,但是必须用int
替换所有出现的情况将花费大量时间,这将更容易
基本上,我希望能够像这样映射代码:
(C) :
爪哇:
而不是:
public void some_function(int arg);
是的,您可以为原语创建一个包装器类,但并不像您描述的那么简单 包装器类使您能够根据请求轻松地移植代码,并确保类型安全。当您为整个对象分配空间时,该类将在Java端占用更多的内存,而不仅仅是为原语分配内存。存储和检索内部值会对性能造成微小的影响。但是,如果这些权衡对您来说是值得的,并且没有在性能敏感的应用程序中使用,那么这就不是问题 但是,如果不为JNA添加额外的功能来确定对象的字节大小及其对应的本机等价物,就不能只使用问题中描述的类。具体来说,您必须实现
NativeMapped
接口。通过扩展已经为您完成这项工作的现有JNA类,这是最容易做到的
对于整型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类方法,如intValue()
您还可以根据需要选择实现compariable
或添加其他方法
JNA中有很多例子。是的,您可以为原语创建一个包装类,但并不像您描述的那么简单 包装器类使您能够根据请求轻松地移植代码,并确保类型安全。当您为整个对象分配空间时,该类将在Java端占用更多的内存,而不仅仅是为原语分配内存。存储和检索内部值会对性能造成微小的影响。但是,如果这些权衡对您来说是值得的,并且没有在性能敏感的应用程序中使用,那么这就不是问题 但是,如果不为JNA添加额外的功能来确定对象的字节大小及其对应的本机等价物,就不能只使用问题中描述的类。具体来说,您必须实现
NativeMapped
接口。通过扩展已经为您完成这项工作的现有JNA类,这是最容易做到的
对于整型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类方法,如intValue()
您还可以根据需要选择实现compariable
或添加其他方法
JNA中有很多例子。添加整个间接层会让事情变得更困难。映射应该从头文件中生成的函数原型中显而易见。或者您可以使用
jint
或jlong
作为DLL中的基本类型。如果您不想这样做,请为Javalong
使用固定宽度的类型,例如int64\t
,因为Java中的原语具有固定的大小。添加整个间接层会使事情变得更困难。映射应该从头文件中生成的函数原型中显而易见。或者您可以使用jint
或jlong
作为DLL中的基本类型。如果您不想这样做,请为Javalong
使用固定宽度类型,例如int64\t
,因为Java中的原语具有固定的大小。
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);
}
}