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

Я вызываю DLL, скомпилированную с помощью VisualStudio 2005 с параметром «#pragma pack (1)». Таким образом, структура alligment (SA) без дополнения для быстрого доступа к данным [1].
Я думаю, что JVM скомпилирован с нормальной структурой alligment [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 effect

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

0

Решение

#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);
}
}
1

Другие решения

Директива #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
1

По вопросам рекламы [email protected]