0

「#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. #pragma pack(1) セットで dll を呼び出すように JNI で設定することは可能ですか?
  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 コンパイラ オプションをローカルで "上書き" することを目的としています。これは、構造体宣言が #pragma pack で囲まれている場合、一部の /Zp[n] オプションでコンパイルされた Dll が、別のアラインメントを必要とする構造体を引き続き使用できることを意味します。

例:

1 つのヘッダー

// lib.h, structure must be 1 byte aligned
struct lib {
    char ch;
    void * p;
};

/Zp4 でコンパイルされた lib を使用したソース

// 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 に答える