在我需要包装的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方法传递,所以结果仍然是空的,但它只是我的假设。也许映射是正确的,但在方法调用中使用错误。提前感谢任何建议。
答案 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);
}
}