4

我正在尝试将类型为signed 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();

我希望这个方法返回字节 []。有解决办法吗?

4

1 回答 1

3

这非常接近你想要的。您不想要,[ANY]因为数组的大小在 C 中不是“固定的”(它由 an 指定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 回答