使用SWIG将类型为char *的结构类型的成员转换为Java中的字节数组(byte []) - java

我试图将类型为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 []。有解决方案吗?

参考方案

那非常接近您想要的。您不想要[ANY],因为数组的大小在C中不是“固定的”(它由int指定,但这不是其类型的一部分)。

您可以使您的typemap可以使用:

%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 typemap中获取“self”指针了-arg$argnum无效,而且$self也无效。没有其他适用于此功能的类型映射会有所帮助。

(请注意,您可能还想为signed char * content编写一个memberin或使其不可变。我也很想完全对%ignore成员进行contentLength)。

JAVA:字节码和二进制有什么区别? - java

java字节代码(已编译的语言,也称为目标代码)与机器代码(当前计算机的本机代码)之间有什么区别?我读过一些书,他们将字节码称为二进制指令,但我不知道为什么。 参考方案 字节码是独立于平台的,在Windows中运行的编译器编译的字节码仍将在linux / unix / mac中运行。机器代码是特定于平台的,如果在Windows x86中编译,则它将仅在Win…

从较小的字节数组(Java)进行长时间转换 - java

我正在尝试将字节数组转换为long,但是接收到BufferUnderflowException ByteBuffer buffer = ByteBuffer.allocate(Long.BYTES); byte[] arg1 = new byte[] {0x04, (byte)0xB0}; buffer.put(arg1, 0, arg1.length); …

字符串到字节的转换 - java

如何将字符串转换为字节?例如,Byte.parseByte("255");导致NumberFormatException,因为(出于某种奇怪的原因)byte在Java中是signed,因此它可以具有的最大值是127。所以我需要一个这样的功能public static byte toByte(String input) { ... } 例如…

Java:正则表达式模式匹配器是否有大小限制? - java

我的模式类似于OR:“word1 | word2 | word3”我大约有800个字。可能有问题吗? 参考方案 您仅受记忆和理智的限制。 :)

从二进制文件读取特定字节 - java

我试图弄清楚如何使用java获取二进制文件中的特定字节。我已经大量阅读了字节级的操作,并使自己彻底困惑。现在,我可以遍历文件,如下面的代码所示,并告诉它停止在我想要的字节处。但是我知道这是脚的,并且有一种“正确”的方式来做到这一点。因此,例如,如果我有一个文件,并且需要从偏移000400返回该字节,如何从FileInputStream中获取该字节?publi…