2016-04-23 5 views
1

Есть ли способ установить глобальное выравнивание байтов памяти для всех структур данных в библиотеке JNA (оболочка Java .dll Java)?Как установить глобальное выравнивание байтов памяти для всех структур в библиотеке JNA?

Иногда мне приходится определять правильное выравнивание методом проб и ошибок во время реализации, и в настоящее время я делаю это очень неуклюжим способом - я устанавливаю выравнивание данных (супер (ALIGN_NONE)) в каждой структуре (много структуры в отдельных файлах).

редактировать: Лучший способ решить мою проблему заключается в расширении структуры:

public abstract class StructureAligned extends Structure { 
    public static final int STRUCTURE_ALIGNMENT = ALIGN_NONE; 

    protected StructureAligned() { 
     super(STRUCTURE_ALIGNMENT); 
    } 

    protected StructureAligned(Pointer p) { 
     super(p, STRUCTURE_ALIGNMENT); 
    } 
} 

..но это привело к следующему вопросу: Какой (Pointer) Конструктор лучше и почему:

super(p, STRUCTURE_ALIGNMENT); 

или

super(STRUCTURE_ALIGNMENT); 
read(); 

или

super(STRUCTURE_ALIGNMENT); 
useMemory(p); 
read(); 

?

+0

Все структуры данных в куче 8 байт выровнены. Можете ли вы привести пример того, что вы имеете в виду? –

+0

Я имею в виду n-байтовое выравнивание полей в структурах на основе com.sun.jna.Structure. Этот вопрос связан с http://stackoverflow.com/questions/36747228/c-c-struct-to-java-jna-structure-pointer-to-struct – jakson

ответ

2

Создайте свой собственный подкласс Structure и вызовите соответствующий конструктор с желаемым типом выравнивания или вызовите setAlignType() в конструкторе.

Если JNA неправильно вычисляет соответствующее выравнивание по умолчанию для наиболее часто используемого компилятора на платформе, тогда вы должны указать ошибку в JNA.

Если у вас есть библиотека, которая просто использует кучу произвольных выравниваний по своим внутренним причинам, то более целесообразно отключить выравнивание для всех ваших классов Structure.