2012-01-13 62 views
0

構造体は、元のC言語のように完全には記述されていません。ポインタからのJNA Java構造体

public class DISPLAY_DEVICE extends Structure { 
     public char DeviceName[] = new char[32]; 
     public int StateFlags; 
    } 

実際には、より多くの変数が必要です。しかし、それは私にそれらを全部移植するのに長い時間がかかります。 これで構造体を作成し、ポインタをdll関数に渡して、device.read();を使用しようとしました。変数を取り戻す。ただし、変数は空に戻ります。だから私の質問は、全体の構造体を記入する必要がありますか?それとも何か間違っていますか?最低で

DISPLAY_DEVICE displayDevice = new DISPLAY_DEVICE(); 
    int i = 0; 
    while((CLibrary.INSTANCE.EnumDisplayDevicesA(Pointer.NULL, i, displayDevice.getPointer(), 0))) { 
     System.out.println("screen" + i); 
     displayDevice.read(); 
     System.out.println(displayDevice.StateFlags); 
     System.out.println(displayDevice.DeviceName); 
+0

C/C++定義からJavaアクセッサコードを生成したい場合、これは考慮すべきツールの1つです。https://github.com/marc-christian-schulze/structs4java –

答えて

4

、あなたはその天然の対応(することができます、あなたが気にしないもののため、バイト[]フィールドでパッドを)と同じサイズになるように構造を定義する必要があります。例えば

:定義はJNAのplatform.jarでは利用できない場合

public class MyStruct extends Structure { 
    public char[] DeviceName = new char[32]; 
    public char StateFlags; 
    public byte[] dontcare = new char[128]; 
} 

また、Cのヘッダからのマッピングを自動生成するJNAeratorを使用することができます。

+0

JNAeratorを試しましたが、そうではありません内部の構造体や共用体でうまく動作します。 – RobotRock

+1

私はネイティブ構造体の全体的なサイズを見つけることをお勧めします、そしてあなたに興味のあるフィールドだけを定義してください。 – technomage

関連する問題