【问题标题】:JNA non-const String member of struct结构的 JNA 非常量字符串成员
【发布时间】:2015-08-19 14:42:16
【问题描述】:

我有一个 C 函数,它需要一个包含非常量字符串的结构。

typedef struct _A {
  char* str;
} A;

void myFunc(A* aptr) { ... }

我已经尝试了很长时间通过 JNA 传递这个东西,但到目前为止没有成功。

public class A extends Structure {
  public String str;
  protected List getFieldOrder() { ...
}

不起作用,因为 String 将被转换为 const char* 而不是我需要的 char*。

public class A extends Structure {
  public byte[] str;
  protected List getFieldOrder() { ...
}

不起作用,因为结构内的字节数组变成了连续的内存而不是指针。

我知道我可以通过使用Memory 并复制字符串来做到这一点。但我无法想象这是首选的方法。

我也尝试过类似的东西

public class NonConstStringMember extends Structure {
  public static class ByReference extends NonConstStringMember implements Structure.ByReference {}        
  public byte[] stringMember;
  protected List getFieldOrder() { ...
}

public class A extends Structure {
  public NonConstStringMember.ByReference str;
}

但它也不起作用,可能是因为对齐问题。

使用 JNA 执行此操作的首选方法是什么?

【问题讨论】:

    标签: string struct constants jna


    【解决方案1】:

    假设您希望它指向您可以写入的任意缓冲区,请使用Pointer(如果您正在分配缓冲区,请为其分配一个Memory 值)。

    然后您使用Pointer.getString(0)Pointer.setString(0, s) 来操作缓冲区内容。

    编辑 Windows 库通常具有大多数函数的 ascii 或 unicode 版本。虽然在大多数情况下,您可以定义一个 Structure 用于两种情况,但有时您需要提供一些额外的处理以确保使用正确的类型。由于这两种模式很少(如果有的话)同时使用,JNA 将选项设置为默认为其中一种(自动映射到正确的函数后缀,并自动将 String 映射到本机 const char*const wchar_t*,具体取决于模式)。

    如果使用 unicode 模式,请使用 setWideString(),否则使用 setString(),或者在您的 Structure 上设置一些访问器来自动为您处理。例如:

    class MyStructure extends Structure {
        private static final boolean ASCII = Boolean.getBoolean("w32.ascii");
        public Pointer stringBuffer = new Memory(X);
        void setStringBuffer(String s) {
            stringBuffer.setString(0, s, ASCII);
        }
        String getStringBuffer() {
            return stringBuffer.getString(0, ASCII);
        }
    }
    

    编辑 请注意,在大多数情况下,您应该使用String 作为字段类型,并在适当的情况下依赖TypeMapper 在后台使用WString(例如User32W32APIOptions.DEFAULT_OPTIONS)。

    【讨论】:

    • 我使用MemorysetWideString 让它工作。但是,我在问题中过于简单化的是结构成员实际上是LPTSTR。因此,预期的字符串不一定很宽。如何从 Java 端处理这个问题并传入正确的字符串?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多