Java JNI结构对齐

Java JNI结构对齐,java,c++,java-native-interface,jna,Java,C++,Java Native Interface,Jna,我正在调用一个使用VisualStudio 2005编译并带有“#pragma pack(1)”设置的DLL。因此,结构alligment(SA)无需填充即可快速访问数据[1]。 我认为JVM是用正常结构alligment[2]编译的 所以我想知道我的选择是什么? 对dll的调用(我不在Codecontrol中)是通过包装器dll(我在Codecontrol中)进行的 我可以用另一个SA设置从包装器中调用dll吗?因此,从Java调用的包装器Dll使用正常的SA设置,并调用使用#pragma p

我正在调用一个使用VisualStudio 2005编译并带有“#pragma pack(1)”设置的DLL。因此,结构alligment(SA)无需填充即可快速访问数据[1]。 我认为JVM是用正常结构alligment[2]编译的

所以我想知道我的选择是什么? 对dll的调用(我不在Codecontrol中)是通过包装器dll(我在Codecontrol中)进行的

  • 我可以用另一个SA设置从包装器中调用dll吗?因此,从Java调用的包装器Dll使用正常的SA设置,并调用使用#pragma pack(1)集编译的Dll
  • 是否可以在JNI中设置使用#pragma pack(1)set调用DLL
  • 我也可以使用JNA。是否有可能进行这样的设置
  • [1]

    [2]
    #pragma pack
    影响编译器处理代码的方式,直到它看到另一个
    #pragma pack
    或一个
    #pragma pop
    ,因此您可以根据需要使用具有不同对齐方式的任意多个不同结构。只要您在包含
    jni.h
    时没有
    pack
    设置,就应该可以了。确保这一点的最简单方法是在使用自定义对齐方式包含任何结构定义之前包含JNI头

    JNA明确提供了映射到
    #pragma pack(1)
    的“无”结构对齐,可以为整个库(即该库接口中定义的所有结构)设置该对齐方式:

    或者,您可以为单个结构设置它:

    class MyStructure extends Structure {
        public MyStructure() {
            super(ALIGN_NONE);
        }
    }
    
    #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
    

    如果在VS2005 dll中描述结构的.h是pragma pack(1),那么只要描述结构的.h也是pragma pack(1),我就看不出有什么问题。您可以添加代码来说明这是一个JVM/JNI问题吗?
    // 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