【问题标题】:Mapping forBSTR data type in JNAJNA 中 BSTR 数据类型的映射
【发布时间】:2011-02-07 17:14:42
【问题描述】:

在我需要包装的 DLL 头文件中,使用 BSTR 数据类型作为 I/O 参数。我需要在 JNA 中创建它的映射。我找到了以下示例:

class BSTR extends PointerType {
  public BSTR() { }
  public BSTR(String value) {
    super(new Memory(value.length()*2+6).share(4));  
    getPointer().setInt(-4, value.length()*2);
    getPointer().setString(0, value, true);
 }
 public String toString() {
    int length = getPointer().getInt(-4);
    char[] data = getPointer().getCharArray(0, length/2);
    return new String(data);
 }

}

但在 JNA 方法调用中使用它后,结果为空(= 长度为 0 且没有数据)。您对如何为 BSTR 创建正确的映射以将其用作函数的 I/O 参数有任何建议吗?看起来 BSTR 没有通过引用传递给 DLL 方法,所以结果仍然是空的,但这只是我的假设。也许映射是正确的,但在方法调用中被错误地使用了。提前感谢您的任何建议。

【问题讨论】:

    标签: java dll native jna


    【解决方案1】:

    我找不到正确的“Type for Type”映射,但可以肯定的是,您可以尝试这种方式并取回一个字符串(长度 > 0)。

    [编辑:见 Technomage 评论]
    注意:你应该非常非常 使用Memory 对象时更加小心。当 java 对象被垃圾收集时,它们在本机级别被释放。这意味着您的代码super(new Memory(value.length()*2+6).share(4)); 只是浪费时间,因为您的new Memory(..) 在您通过线路后的那一刻就消失了,因为.share(4) 提供了一个新的独立Pointer

    class BSTRUtils {
      private BSTR() { }
      public static Memory toNative(String value) {
        Memory m = new Memory(value.length()*2+6);  
        m.setInt(0, value.length()*2);
        m.setString(4, value, true);
        return m;
      }
      public static String toString(PointerByReference pbr) {
        return toString(pbr.getValue());
      }
      public static String toString(Pointer p) {
        int length = p.getInt(0);
        char[] data = p.getCharArray(4, length/2);
        return new String(data);
      }
    }
    

    【讨论】:

    • Memory.share() 调用创建了 SharedMemory 的内部类实例,它隐式引用了原始 Memory 对象。所以ctor中原来的用法没有错。
    • 您应该相应地编辑您的答案。不正确的断言不需要继续存在......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-30
    相关资源
    最近更新 更多