【问题标题】:JNI Structure AlignmentJNI 结构对齐
【发布时间】:2013-11-08 09:53:09
【问题描述】:

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

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

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

[1]#pragma pack effect

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

【问题讨论】:

  • 如果描述VS2005 dll中结构的.h是pragma pack(1),只要你描述结构的.h也是,我看不出问题出在哪里。你能添加代码来说明这是一个 JVM/JNI 问题吗?

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


【解决方案1】:

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

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

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

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

class MyStructure extends Structure {
    public MyStructure() {
        super(ALIGN_NONE);
    }
}

【讨论】:

    【解决方案2】:

    #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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-02-19
      • 1970-01-01
      • 2013-07-24
      • 2018-03-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多