2

C でいくつかの char ポインターを含む構造体があります。

struct inputsheet
{
    char* TestCaseID[MAX_TEST_CASES];
    char*  Description[MAX_TEST_CASES];
};

構造体のオブジェクトの配列を返す関数があります:

struct inputsheet* getapi(char *docname);

これをJavaで使用したいと思います。この構造体オブジェクトの配列をどのように処理できますか? 単一のオブジェクトを処理できますが、配列は処理できません。

単一のオブジェクトの場合、C での私のコードは次のとおりです。

public class str3 extends com.sun.jna.Structure implements com.sun.jna.Structure.ByReference {  
   public Pointer a1;
   public Pointer b2;
   public Pointer c3[]=new Pointer[10];
}

アクセス:

str2 s2=CLibrary.INSTANCE.parseid(xmlFile1);
for(Pointer p1:s2.testCaseID) {
    if(p1!=null)
    {
        System.out.println(p1.getString(0));
    }
}

編集

\\c code
struct str3{
char *a;
char *b;
char *ab[10];
}

\\jna implementation


package parser;
import com.sun.jna.Pointer;
public class str3 extends com.sun.jna.Structure implements     com.sun.jna.Structure.ByReference{ 
public Pointer a1;
public Pointer b2;
public Pointer c3[]=new Pointer[10];
}


\\calling it
import com.sun.jna.Native;
import com.sun.jna.Pointer;
 class ab{
    interface CLibrary extends Library{
    CLibrary INSTANCE = (CLibrary) Native.loadLibrary("chardll",
    CLibrary.class);
    str3 getStruct();
    }

public static void main(String[] args) {
    int size = 5;
    str3 a=CLibrary.INSTANCE.getStruct();
    str3[] ab=(str3[])a.toArray(size);
    System.out.println(ab[0].a1.getString(0));          
    }
}

出力としてガベージ値を与えています。正しい出力を得るためにコードを更新する必要があります..

4

1 に答える 1

2

javadocから:

構造体の配列を返す

適切な型の構造体を返すようにメソッドを宣言してから、呼び出しStructure.toArray(int)て、適切なサイズの初期化された構造体の配列に変換します。Structureクラスには引数のないコンストラクターが必要であり、呼び出された関数に適した方法で該当する場合は、返されたメモリを解放する責任があることに注意してください 。

// Original C code
struct Display* get_displays(int* pcount);
void free_displays(struct Display* displays);

// Equivalent JNA mapping
Display get_displays(IntByReference pcount);
void free_displays(Display[] displays);
...
IntByReference pcount = new IntByReference();
Display d = lib.get_displays(pcount);
Display[] displays = (Display[])d.toArray(pcount.getValue());
...
lib.free_displays(displays);

編集

通常、構造は次のようになります (ネイティブの定義に基づく)。

class inputsheet extends Structure {
    public Pointer[] TestCaseID = new Pointer[MAX_TEST_CASES];
    public Pointer[] Description = new Pointer[MAX_TEST_CASES];
}

public inputsheet getapi(String docname);

int size = ...; // whatever you do to figure out the size of your returned array 
inputsheet sheet = INSTANCE.getapi("some-doc");
inputsheet[] sheets = (inputsheet[])sheet.toArray(size);

inputsheet呼び出し元がフィールドに書き込む必要がない場合は、String代わりに を使用する必要がありPointerます。

于 2013-03-15T11:45:03.350 に答える