在JNA中映射forBSTR数据类型

时间:2011-02-07 17:14:42

标签: java dll native jna

在我需要包装的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方法调用中使用它后,结果为空(= length为0且没有数据)。您是否有任何建议如何为BSTR创建正确的映射以将其用作函数的I / O参数?看起来BSTR没有通过引用DLL方法传递,所以结果仍然是空的,但它只是我的假设。也许映射是正确的,但在方法调用中使用错误。提前感谢任何建议。

1 个答案:

答案 0 :(得分:0)

我找不到正确的“Type for Type”映射,但只是为了确定,你能以这种方式尝试并返回一个字符串(长度> 0)。

[编辑:请参阅Technomage评论]
注意 :使用Memory对象时,您应该更加谨慎 。当java对象收集了garbadge时,它们在本机级别获得自由。这意味着您的代码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);
  }
}