1

我在我的 DLL 中定义了这种类型:

typedef int FMOD_MEMORY_TYPE;

我可以在 Java 中为此创建一个类,这样我就知道FMOD_MEMORY_TYPE它只是一个int

public final class FMOD_MEMORY_TYPE {
    public int value;
}

我认为它需要相同数量的内存?

这种类型被大量传递给函数,如果在 Java 中它几乎也有自己的 typedef,它会变得容易得多。如果没有,我怎样才能对 Java 中的类型进行一些映射?

从本质上讲,它只是一个int但必须替换所有出现的事件int会花费很多时间,这会更容易。

本质上,我希望能够像这样映射代码:(C):

void some_function(FMOD_MEMORY_TYPE argument);

<=> 爪哇:

public void some_function(FMOD_MEMORY_TYPE arg);

代替:

public void some_function(int arg);
4

1 回答 1

0

是的,您可以为原语创建一个包装类,但不像您描述的那么简单。

包装器类使您可以轻松地按照您的要求移植代码,以及类型安全。当您为整个对象分配空间而不是简单地为基元分配内存时,该类将在 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);
    }
}

这样做将继承setValue()IntegerType继承所有核心 Java Number类方法,例如intValue().

您还可以根据需要选择实现Comparable或添加其他方法。

JNA 的WinDef 类中有很多例子,等等。

于 2020-08-31T22:37:36.500 回答