2017-06-14 1 views
0

こんにちは、私は構造体のフォームを私はjavaに含める必要があります。 JNA構造StackOverflowError on create

struct usb_relay_device_info { 
    unsigned char *serial_number; 
    char *device_path; 
    usb_relay_device_type type; 
    usb_relay_device_info* next;}; 

は、私は私のプロジェクトを実行しようとすると、私はそれをデバッグするとき、私はstackOverwlowError

Exception in thread "main" java.lang.StackOverflowError 
at java.util.Hashtable.get(Hashtable.java:363) 
at java.util.Properties.getProperty(Properties.java:969) 
at java.util.Properties.getProperty(Properties.java:988) 
at java.lang.System.getProperty(System.java:756) 
at com.sun.jna.Native.getDefaultStringEncoding(Native.java:669) 
at com.sun.jna.Native.getStringEncoding(Native.java:662) 
at com.sun.jna.Structure.<init>(Structure.java:177) 
at com.sun.jna.Structure.<init>(Structure.java:172) 
at com.sun.jna.Structure.<init>(Structure.java:159) 
at com.sun.jna.Structure.<init>(Structure.java:151) 
at relay.RelayInfo.<init>(RelayInfo.java:11) 
at sun.reflect.GeneratedConstructorAccessor1.newInstance(Unknown Source) 
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 
at java.lang.reflect.Constructor.newInstance(Constructor.java:423) 
at java.lang.Class.newInstance(Class.java:442) 
at com.sun.jna.Structure.newInstance(Structure.java:1773) 
at com.sun.jna.Structure.newInstance(Structure.java:1759) 
at com.sun.jna.Structure.size(Structure.java:1030) 
at com.sun.jna.Native.getNativeSize(Native.java:1172) 
at com.sun.jna.Structure.getNativeSize(Structure.java:2072) 
at com.sun.jna.Structure.getNativeSize(Structure.java:2062) 
at com.sun.jna.Structure.validateField(Structure.java:1105) 
at com.sun.jna.Structure.validateFields(Structure.java:1119) 
at com.sun.jna.Structure.<init>(Structure.java:179) 
at com.sun.jna.Structure.<init>(Structure.java:172) 
at com.sun.jna.Structure.<init>(Structure.java:159) 
at com.sun.jna.Structure.<init>(Structure.java:151) 
at relay.RelayInfo.<init>(RelayInfo.java:11) 
at sun.reflect.GeneratedConstructorAccessor1.newInstance(Unknown Source) 
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 
at java.lang.reflect.Constructor.newInstance(Constructor.java:423) 

を取得するJavaクラス

public class RelayInfo extends Structure { 

public String device_path; 
public RelayInfo next; 
public byte[] serial_number; 
public RelayType type; 

@Override 
protected List getFieldOrder() { 
    return Arrays.asList("device_path", "next", "serial_number", "type"); 
}} 

を作成する方法threw'java.lang.StrackOverflowError氏は述べています'例外。 relay.RelayInfo.toString()を評価できません

しかし、私はtoStringを上書きする必要はありませんか?

何が間違っていますか?誰かアイデア? ありがとうございました

+0

あなたのフィールドはあなたのC構造体に比べて間違っていますか? Java構造体のフィールド順序が '' serial_number ''、 'device_path'、 'type'、 'next' 'であるべきではありませんか? – cubrr

+0

はすでに変更されています。今度はいつも得ます lang.IllegalArgumentException:クラスrelay.RelayInfo、フィールド名 'type'(インタフェースrelay.RelayType)のクラス構造体が無効です:タイプ "relay.RelayType"はサポートされていません。タイプ "relay"のネイティブサイズ。relayTypeは」 – Alessandra

答えて

1

ここでは、タイプマッピングと引数の順序の2つの問題があります。

Java構造体は、オフセットによって変数をマップするため、Java構造体はC構造体の変数の順序と正確に一致する必要があります。私はあなたがすでにそれを修正したというコメントから理解しています。

第2に、type mappingsに注意する必要があります。 char *はStringでもかまいませんが、ByteByReferenceでも構いませんが、C構造体のコンテキストを調べて、それを判断する必要があります。私はdevice_pathのためにStringを正しくマップしたと信じていますが、serial_numberByteByReferenceであり、あなたが定義したbyte[]ではないことを強く疑っています(これはあなたが長所を持っていないため正しくない)。最後に、タイプRelayTypeの変数を定義しましたが、対応するC usb_relay_device_typeに対応するJNA構造体は記述していません。 (編集:あなたはそれがenumintにマップされていることを明確にしたのを参照してください)

+0

不明であるので、私のようなクラスを作成し、私のusb_relay_device_typeはCで列挙型ですありがとう: 'パブリックインタフェースのrelayType { 公共最終静的int型USB_RELAY_DEVICE_ONE_CHANNEL = 1; 公共最終静的int型USB_RELAY_DEVICE_TWO_CHANNEL = 2; 公共ファイナル静的int型USB_RELAY_DEVICE_FOUR_CHANNEL = 4; 公共最終静的int型USB_RELAY_DEVICE_EIGHT_CHANNEL = 8;? は} '作品 – Alessandra

+0

その権利であるが、それはやり過ぎのビットですあなたは自分の他のクラスの定数を定義し、' type'が変数を宣言することができます。 'int'として。 –

0

私の答えが見つかりました。 は方法がわからないが、それはリレーのためにどのように動作するか、それは

public class RelayInfo extends Structure { 

/* 
struct RelayInfo { 
    unsigned char *serial_number; 
    char *device_path; 
    usb_relay_device_type type; 
    usb_relay_device_info* next; 
}; 
*/ 

public ByteByReference serial_number; 
public String device_path; 
public int type; 
public String next; 

@Override 
protected List getFieldOrder() { 
    return Arrays.asList("serial_number", "device_path", "type", "next"); 
}} 

ザッツを進めています。私を助けようとした方法をみんなに 感謝:)

0

はそれはとてもPointerByReferenceRelayInfo wrapedを使用しようとthat のようなノード構造です。フィールドを維持するをRelayInfo.ByReferenceとして

関連する問題