2011-11-08 5 views
0

私は、次のC++コードを持っている:JNA - 構造作成エラー

typedef struct { 
    int TabSock[1024]; 
    DWORD TabIP[1024]; 
    int NumSockConec; 
} TTABSOCK; 
typedef TTABSOCK *PTABSOCK; 

と機能:

TTABSOCK __stdcall mt_connectlist(void); 

上記の関数はDLLであるが。 JNAを使ってJavaでStructを作成しようとしていますが、成功しません。私のプログラムはエラーを返し、そのネイティブ関数を実行しようとすると閉じます。

以下

は、Java/JNAにおける構造体のための私の実装です:私は間違っ

public class TTABSOCK extends Structure { 

    public int[] TabSock = new int[1024]; 
    public DWORD[] TabIP = new DWORD[1024]; 
    public int NumSockConec; 
} 

何をしているのですか?

ありがとうございます。

答えて

0

私はナそれを忘れて...あなたは配列を初期化べきではないと思うが、それが問題になることはありません。..

public static class TTABSOCK extends Structure { 

    public int[] TabSock = new int[1024]; 
    public DWORD[] TabIP = new DWORD[1024]; 
    public int NumSockConec; 

    public static class ByReference extends TTABSOCK implements Structure.ByReference {}; 
    public static class ByValue extends TTABSOCK implements Structure.ByValue {}; 
} 
+0

こんにちは!残念ながらうまくいきません。 – eliangela

+0

キャッチされている場合、何が例外ですか? –

+0

その関数を呼び出すと、JVMがクラッシュします。私はいくつかの開発者と話をし、彼らは同じ問題があると私に言った。 DLLには何らかのエラーがあると考えられます。 私は別の機能を試しています。 ありがとうございました – eliangela

0

あなたは値によって構造を返していることを確認する必要があります。デフォルトでは、JNA構造体は引数と戻り値の型で "struct *"として扱われるので、この場合は "struct"動作を指定する必要があります。

public interface MyLibrary extends StdCallLibrary { 
    class TTABSOCK extends Structure { 
     public static class ByValue extends TTABSOCK implements Structure.ByValue { } 
     // ... 
    } 
    TTBASOCK.ByValue mt_connectlist(); 
} 
+1

こんにちは!私は値で構造体を返しますが、動作しません。私はいくつかのデベロッパーと話し合い、同じ問題があると私に言った。 DLLには何らかのエラーがあると考えられます。私は別の機能を使って解決しました。どうもありがとう。 – eliangela

+0

もう1つは、構造全体のサイズと配置です。これらがネイティブコードとJavaコードの間で一致しない場合、値による構造は機能しません。ネイティブコードの "sizeof(TTBASOCK)"とJavaのTTBASOCK.size()を比較してください。 – technomage