0

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

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

  1. 我可以用另一个 SA 设置从 Wrapper 中调用一个 dll 吗?因此,从 Java 调用的 Wrapper-Dll 使用正常的 SA 设置并调用使用 #pragma pack(1) 集编译的 dll。
  2. 是否可以在 JNI 中进行设置以调用带有#pragma pack(1) 集的 dll?
  3. 我也可以使用 JNA。有没有可能做这样的设置。

[1] #pragma pack 效果

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

4

2 回答 2

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
于 2013-11-08T12:12:14.277 回答
1

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

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

interface MyLibrary extends Library {
    int STRUCTURE_ALIGNMENT = Structure.ALIGN_NONE;
}

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

class MyStructure extends Structure {
    public MyStructure() {
        super(ALIGN_NONE);
    }
}
于 2013-11-08T12:00:58.000 回答