Java 在JNA中映射基元类型,同时保留本机typedef类

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,

我在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
,但是必须用
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中的基本类型。如果您不想这样做,请为Java
long
使用固定宽度的类型,例如
int64\t
,因为Java中的原语具有固定的大小。添加整个间接层会使事情变得更困难。映射应该从头文件中生成的函数原型中显而易见。或者您可以使用
jint
jlong
作为DLL中的基本类型。如果您不想这样做,请为Java
long
使用固定宽度类型,例如
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);
    }
}