我正在调用使用VisualStudio 2005编译的DLL,其中包含“#pragma pack(1)”设置。因此结构alligment(SA)没有填充用于快速数据访问[1]。 我认为JVM是用正常结构的alligment编译的[2]。
所以我想知道我的选择是什么? 对dll的调用(我不在Codecontrol中)是通过一个包装器dll(我在Codecontrol中)。
[2] http://www.velocityreviews.com/forums/t128433-jni-with-1-byte-alignment-crashes-jvm.html
答案 0 :(得分:1)
#pragma pack
会影响编译器在看到另一个#pragma pack
或#pragma pop
之前如何处理代码,因此您可以根据需要使用不同的对齐方式来构建多个不同的结构。只要您在添加pack
时没有jni.h
设置,就应该没问题。确保这一点的最简单方法是在包含任何具有自定义对齐的结构定义之前包含JNI标头。
JNA显式提供了映射到#pragma pack(1)
的“none”的结构对齐,并且可以为整个库(即在该库接口中定义的所有结构)设置它:
interface MyLibrary extends Library {
int STRUCTURE_ALIGNMENT = Structure.ALIGN_NONE;
}
或者您可以为单个结构设置它:
class MyStructure extends Structure {
public MyStructure() {
super(ALIGN_NONE);
}
}
答案 1 :(得分:1)
#pragma pack指令旨在本地“覆盖”/ Zp编译器选项。 这意味着使用某些/ Zp [n]选项编译的Dll仍然可以使用需要不同对齐的结构,前提是结构声明包含在#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