2013-07-17 255 views
0

的陣列考慮我有以下的C結構的定義:指針結構

struct StructA { 
    int a; 
    int b; 
}; 

struct StructB { 
    struct A *as; 
    int count; 
}; 

所以,StructBas領域StructA「大小count的組成的數組。然後,我在Java中代表struct StructA下面的類:

public class StructA extends Structure { 
    public int a; 
    public int b; 

    public StructA() { 

    } 

    public StructA(Pointer p) { 
     super(p); 
     read(); 
    } 

    @Override 
    protected List<String> getFieldOrder() { 
     return Arrays.asList(new String[]{"a", "b"}); 
    } 
    public static class Reference extends StructA implements Structure.ByReference { } 
    public static class Value extends StructA implements Structure.ByValue { } 
} 

不過,我將如何在Java中代表struct B?由於as不是內聯陣列,因此我必須將as表示爲Pointer,那麼如何將Java StructA[]變成Pointer

+0

什麼什麼上有問題StructA []或ArrayList中或?它仍然是一個參考,您對陣列上的項目所做的任何更改都會傳播到原始類。 – gcandal

+0

或者更好的是,只需用一個ArrayList替換StructB,後者將完成StructB的所有操作。 – kiheru

回答

0

您需要確保該字段具有指針類型。您可以使用Structure.ByReference(使您的結構類的子類實現Structure.ByReference標記接口)執行此操作,然後使用Structure.toArray()在該內存上覆蓋連續的結構數組。

您也可以使用簡單的Pointer,但是您需要手動讀取/寫入結構和相關對象,以及執行JNA通常爲您執行的本機內存同步。

例如:

class StructA { 
    public static class ByReference extends StructA implements Structure.ByReference { } 
} 
class StructB { 
    public StructA.ByReference sa; 
    public int size; 
    public StructA[] getMembers() { 
     return (StructA[])sa.toArray(this.size); 
    } 
}