4

署名されたchar*型の構造体のメンバーをJavaのバイト配列に変換しようとしています。私は次の構造を持っています:

typedef struct {
    signed char * content;
    int contentLength;
} Foo;

私はこれを試しました:

%typemap(jni) signed char *content [ANY] "jbyteArray"
%typemap(jtype) signed char *content [ANY] "byte[]"
%typemap(jstype) signed char *content [ANY] "byte[]"
%typemap(javaout) signed char *content [ANY] {
    return $jnicall;
}
%typemap(memberin) int contentLength [ANY] {
    int length=0;
    $1 = &length;
}

%typemap(out) signed char * content [ANY] {
    $result = JCALL1(NewByteArray, jenv, length);
    JCALL4(SetByteArrayRegion, jenv, $result, 0, length, $1);
}

しかし、結果はありません。FooのメソッドgetContentには、次のシグネチャがあります。

SWIGTYPE_p_signed_char getContent();

このメソッドがbyte[]を返すようにしたい。解決策はありますか?

4

1 に答える 1

3

それはあなたが望むものにかなり近いです。[ANY]配列のサイズはCで「固定」されていないため、必要ありません(これは、で指定されますintが、その型の一部ではありません)。

タイプマップを次のもので機能させることができます。

%module test

%typemap(jni) signed char *content "jbyteArray"
%typemap(jtype) signed char *content "byte[]"
%typemap(jstype) signed char *content "byte[]"
%typemap(javaout) signed char *content {
    return $jnicall;
}

%typemap(out) signed char * content {
    $result = JCALL1(NewByteArray, jenv, arg1->contentLength);
    JCALL4(SetByteArrayRegion, jenv, $result, 0, arg1->contentLength, $1);
}

// Optional: ignore contentLength;
%ignore contentLength;

%inline %{
typedef struct {
    signed char * content;
    int contentLength;
} Foo;
%}

ここで何かが足りないかもしれませんが、outタイプマップ内から「self」ポインターを取得するためのより良い方法をこれよりも見ることはできません-arg$argnum機能せず、どちらも機能しません$self。この関数に適用される、役立つタイプマップは他にありません。

(おそらく、メンバーを作成したり、不変にしたりすることもできますsigned char * content。私もメンバーに完全に誘惑されます)。%ignorecontentLength

于 2012-08-15T21:40:22.983 に答える