无符号类型的 BridJ 类型映射
BridJ type mapping for unsigned types
当使用 JNAerator 生成 BridJ 代码时,它会将无符号类型(例如 windows' ULONG
)映射到正常的 Java long
:
// c code
typedef struct _S {
USHORT a;
ULONG b;
ULONG64 c;
} S;
// generated java code
class S extends StructObject {
@Field(0)
public short a() {
return this.io.getShortField(this, 0);
}
@Field(0)
S setA(short a) {
this.io.setShortField(this, 0, a);
return this;
}
@CLong
@Field(1)
public long b() {
return this.io.getCLongField(this, 2);
}
@CLong
@Field(1)
S setB(long b) {
this.io.setCLongField(this, 2, b);
return this;
}
// ULONG64 is ignored and not generated at all
但是,Java 类型是 signed,而不是 unsigned。如果我需要手动更正,我需要使用哪些类型?像这样的字节数组?
@Field(0)
public byte[] a() { ... };
@Field(0)
public byte[] setA(byte[] a) { // check correct length };
有符号和无符号类型的大小相同,只是语义不同。您绝对应该使用 JNAerator 选择的类型,并使用 Java 处理无符号类型的原语,例如 the ones introduced in Java 8 (for instance, Integer.divideUnsigned).
如果 Java 8 不适合您,您可以 use casts and manipulate bits wisely。
当使用 JNAerator 生成 BridJ 代码时,它会将无符号类型(例如 windows' ULONG
)映射到正常的 Java long
:
// c code
typedef struct _S {
USHORT a;
ULONG b;
ULONG64 c;
} S;
// generated java code
class S extends StructObject {
@Field(0)
public short a() {
return this.io.getShortField(this, 0);
}
@Field(0)
S setA(short a) {
this.io.setShortField(this, 0, a);
return this;
}
@CLong
@Field(1)
public long b() {
return this.io.getCLongField(this, 2);
}
@CLong
@Field(1)
S setB(long b) {
this.io.setCLongField(this, 2, b);
return this;
}
// ULONG64 is ignored and not generated at all
但是,Java 类型是 signed,而不是 unsigned。如果我需要手动更正,我需要使用哪些类型?像这样的字节数组?
@Field(0)
public byte[] a() { ... };
@Field(0)
public byte[] setA(byte[] a) { // check correct length };
有符号和无符号类型的大小相同,只是语义不同。您绝对应该使用 JNAerator 选择的类型,并使用 Java 处理无符号类型的原语,例如 the ones introduced in Java 8 (for instance, Integer.divideUnsigned).
如果 Java 8 不适合您,您可以 use casts and manipulate bits wisely。