2016-04-23 6 views
1

JNAライブラリ(* .dll Javaラッパー)内のすべてのデータ構造に対してグローバルメモリバイトアライメントを設定する方法はありますか?JNAライブラリ内のすべての構造体に対してグローバルメモリバイトアライメントを設定するにはどうすればよいですか?

実装時に試行錯誤して正しいアライメントを決定する必要がある場合がありますが、現在、私は非常にやっかいな方法でこれをやっています - データアライメント(スーパー(ALIGN_NONE))を各構造構造を別々のファイルに保存)。

編集:私の問題を解決するための 最良の方法は、構造を拡張することでした:

public abstract class StructureAligned extends Structure { 
    public static final int STRUCTURE_ALIGNMENT = ALIGN_NONE; 

    protected StructureAligned() { 
     super(STRUCTURE_ALIGNMENT); 
    } 

    protected StructureAligned(Pointer p) { 
     super(p, STRUCTURE_ALIGNMENT); 
    } 
} 

..butこれは、次の質問につながった:(ポインタ)コンストラクタが優れていると理由:

super(p, STRUCTURE_ALIGNMENT); 

または

super(STRUCTURE_ALIGNMENT); 
read(); 

または

super(STRUCTURE_ALIGNMENT); 
useMemory(p); 
read(); 

+0

ヒープ上のすべてのデータ構造は8バイトに整列しています。あなたが意味するものの例を挙げることができますか? –

+0

com.sun.jna.Structureに基づく構造体のフィールドのnバイト整列を意味します。この質問はhttp://stackoverflow.com/questions/36747228/c-c-struct-to-java-jna-structure-pointer-to-structに関連しています。 – jakson

答えて

2

独自のStructureサブクラスを作成し、適切なアラインメントタイプのコンストラクタをコールするか、コンストラクタでsetAlignType()を呼び出します。

JNAがプラットフォーム上で最も一般的に使用されるコンパイラの適切なデフォルトの配置を正しく計算していない場合は、JNAに対してバグを報告する必要があります。しかし、あなたはその後、共通の基底クラスを経由して、すべてのStructureのクラスのアラインメントをオフ、単に独自の内部的な理由のために、任意のアライメントの束を使用するライブラリを持っている場合は

がより適切です。

関連する問題