2015-02-18 6 views
1

При создании BridJ кода JNAerator, он отображает беззнаковых типов (например, окна ULONG) к нормальному Явы long:Bridj отображение типа для беззнаковых типов

// 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 являются подписаны не unsigned. Если мне нужно исправить это вручную, какие типы мне нужно использовать? Байт-массивы вроде так?

@Field(0) 
public byte[] a() { ... }; 

@Field(0) 
public byte[] setA(byte[] a) { // check correct length }; 

ответ

0

Подписанные и неподписанные типы имеют одинаковый размер, только разные семантики. Вы должны определенно использовать типы, выбранные JNAerator, и использовать Java-примитивы, которые имеют дело с неподписанными типами, такими как the ones introduced in Java 8 (например, Integer.divideUnsigned).

Если Java 8 не является для вас вариантом, вы можете просто use casts and manipulate bits wisely.