JNI结构对齐

时间:2013-11-08 09:53:09

标签: java c++ java-native-interface jna

我正在调用使用VisualStudio 2005编译的DLL,其中包含“#pragma pack(1)”设置。因此结构alligment(SA)没有填充用于快速数据访问[1]。 我认为JVM是用正常结构的alligment编译的[2]。

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

  1. 我可以使用其他SA设置调出包装器吗?因此,从Java调用的Wrapper-Dll使用正常的SA设置并调用使用#pragma pack(1)set编译的dll。
  2. 是否可以在JNI中进行设置以使用#pragma pack(1)set来调用dll?
  3. 我也可以使用JNA。是否有可能进行这样的设置。
  4. [1] #pragma pack effect

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

2 个答案:

答案 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