2017-03-25 1 views
-2

私のプログラムに構造体を持つC++ DLLを使用する必要があります。このために、私はJNAを使用しますが、私は内部の別のSTRUCが含まれている構造体を呼び出すしようとすると、例外がスレッド "main"の例外java.lang.IllegalStateException:配列フィールドを初期化する必要があります

後、構造体のコードですが起こる:

public class SSP_PACKET extends Structure { 
    public short packetTime; 
    public char PacketLength; 
    public char[] packetData; 

    @Override 
    protected List<String> getFieldOrder() { 
     return Arrays.asList(new String[]{"packetTime", 
       "PacketLength", 
       "packetData"}); 
    }  
} 

public class SSP_COMMAND_INFO extends Structure { 
    public byte CommandName; 
    public byte LogFileName; 
    public byte Encrypted; 
    public SSP_PACKET Transmit = new SSP_PACKET(); 
    public SSP_PACKET Receive = new SSP_PACKET(); 
    public SSP_PACKET PreEncryptTransmit = new SSP_PACKET(); 
    public SSP_PACKET PreEncryptReceive = new SSP_PACKET(); 

    @Override 
    protected List<String> getFieldOrder() { 
     return Arrays.asList(new String[]{"CommandName", 
       "LogFileName", 
       "Encrypted", 
       "Transmit", 
       "Receive", 
       "PreEncryptTransmit", 
       "PreEncryptReceive"}); 
    } 
} 

と例外:

スレッド内

例外 "メイン" java.lang.IllegalStateException:配列 フィールドは com.sun.jna.Structure.calculateSizeで com.sun.jna.Structure.deriveLayout(Structure.java:1228)で初期化する必要があります(Structure.java:1097)a t com.sun.jna.Structure.allocateMemory(Structure.java:390)at com.sun.jna.Structure.ensureAllocated(Structure.java:366)at com.sun.jna.Structure.ensureAllocated(構造。 java:356)at com.sun.jna.Structure.size(Structure.java:423)at com.sun.jna.Structure.size(Structure.java:1075)at com.sun.jna.Native。 getNativeSize(Native.java:1271)at com.sun.jna.Structure.getNativeSize(Structure.java:2125)at com.sun.jna.Structure.getNativeSize(Structure.java:2115)at com.sun。 ja.Structure.validateField(Structure.java:1149)at com.sun.jna.Structure.validateFields(Structure.java:1162)at com.sun.jna.Structure(Structure.java:189)at(Struct.java:161)、 com.sun.jna.Structure(Structure.java:169)、 にあります。com.sun.jna.Structure(Structure.java:161) SSP_COMMAND_INFO。(SSP_COMMAND_INFO.java:5) バリ。(Validator.java:28)test.mainで(test.java:10)

答えて

1

時にエラーがラインに自明と点むしろですあなたに問題を起こす数字。 SSP_COMMAND_INFOクラスの5行目はSSP_PACKETオブジェクトをインスタンス化しようとしましたが、配列を初期化していないためその手順に失敗しています。 JNA(したがってC)は、配列のサイズやメモリの予約量を​​知りません。

あなたpublic char[] packetData;ニーズは、新しい配列の長さに初期化されるなど、

public char[] packetData = new char[255]; 

(もちろん、あなたが実際の配列のサイズが何であるかを見るためにあなたのAPIを参照する必要はなく、255。)

もう一つの重要な点は、Javaのタイプがあなたがここで望んでいるものである可能性は非常に低いということです。 charでCヘッダーファイルをマッピングする場合は、ここでそれをbyteに置き換えます。最後の注意として

public byte PacketLength; 
public byte[] packetData = new byte[255]; 

をあなたはnew SSP_PACKET()を持っているとして、あなたのSSP_COMMAND_INFO構造内にネストされた構造を初期化する必要がある:私はあなたが本当にしたい推測しています。 JNAは自動的にこれを行います。

+0

Danielさん、私はJavaとJNIの初心者ですから、このアプリケーションの開発にはいくつかの問題がありました。あなたが説明した方法で私はそれを動作させました。 –

関連する問題