Выравнивание структуры JNI

Я вызываю DLL, скомпилированную с VisualStudio 2005, с настройкой «#pragma pack (1)». Таким образом, структура alligment (SA) не имеет прописных букв для быстрого доступа к данным [1]. Я думаю, что JVM скомпилирован с нормальным структурным аллигментом [2].

Поэтому я хочу знать, какие у меня варианты? Вызов DLL (я не в Codecontrol) проходит через dll оболочки (я в Codecontrol).

  1. Могу ли я вызвать из Wrapper dll с другой настройкой SA? Чтобы Wrapper-Dll, который вызывается из Java, использует обычную настройку SA и вызывает DLL, которая скомпилирована с набором #pragma pack (1).
  2. Возможно ли установить параметр в JNI для вызова DLL с набором #pragma pack (1)?
  3. Я также мог бы использовать JNA. Есть ли возможность сделать такую ​​настройку.

[1] Эффект pragma pack

[2] http://www.velocityreviews.com/forums/t128433-jni-with-1-byte-alignment-crashes-jvm.html

    #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 предназначена для локального «переписывания» параметра компилятора / Zp. Это означает, что Dll, скомпилированный с некоторым параметром / Zp [n], все еще может использовать структуру, требующую другого псевдонима, при условии, что объявления структуры заключены в пакет #pragma.

    Пример:

    Один заголовок

     // 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