Я вызываю DLL, скомпилированную с помощью VisualStudio 2005 с параметром «#pragma pack (1)». Таким образом, структура alligment (SA) без дополнения для быстрого доступа к данным [1].
Я думаю, что JVM скомпилирован с нормальной структурой alligment [2].
Итак, я хочу знать, какие у меня есть варианты?
Вызов dll (я не в Codecontrol) проходит через оболочку dll (я в Codecontrol).
#pragma pack
влияет на то, как компилятор обрабатывает код, пока не увидит другой #pragma pack
или #pragma pop
Таким образом, вы можете иметь столько разных структур с разным выравниванием, сколько вам нужно. Пока у вас нет pack
установка, когда вы включаете jni.h
у тебя должно быть все в порядке. Самый простой способ убедиться в этом — включить заголовки JNI, прежде чем включать любое из определений структуры с настраиваемым выравниванием.
JNA явно обеспечивает структурное выравнивание «none», которое отображается на #pragma pack(1)
и он может быть установлен для всей библиотеки (то есть всех структур, определенных в этом интерфейсе библиотеки):
interface MyLibrary extends Library {
int STRUCTURE_ALIGNMENT = Structure.ALIGN_NONE;
}
Или вы можете установить его для отдельной структуры:
class MyStructure extends Structure {
public MyStructure() {
super(ALIGN_NONE);
}
}
Директива #pragma pack предназначена для локальной перезаписи опции компилятора / Zp.
Это означает, что Dll, скомпилированная с некоторым параметром / Zp [n], все еще может использовать структуру, требующую другого aligment, при условии, что объявления структуры заключены в #pragma pack.
Пример:
Один заголовок
// lib.h, structure must be 1 byte aligned
struct lib {
char ch;
void * p;
};
Исходный код с использованием библиотеки lib, скомпилированной с / Zp4
// user.cpp
#pragma pack(push, 1) // force 1 byte for the header, save current value
#include "lib.h"#pragma pack(pop) // restore saved structure aligment