使用SWIG使用Java字节数组设置char*类型的C结构的成员

使用SWIG使用Java字节数组设置char*类型的C结构的成员,java,swig,Java,Swig,例如,我们有以下结构: typedef struct Foo { unsigned char * data; } Foo; 我想用Java字节数组(byte[])设置data成员。我只想用set方法而不是get。我已经读过了,但我不能做设置。有人能帮我吗 已更新: 我创建了一些类型映射,并取得了成功: %typemap(jni) unsigned char * data "jbyteArray" %typemap(jtype) unsigned char * data "byte[]"

例如,我们有以下结构:

typedef struct Foo
{
    unsigned char * data;
} Foo;
我想用Java字节数组(
byte[]
)设置
data
成员。我只想用set方法而不是get。我已经读过了,但我不能做设置。有人能帮我吗

已更新

我创建了一些类型映射,并取得了成功:

%typemap(jni) unsigned char * data "jbyteArray"
%typemap(jtype) unsigned char * data "byte[]"
%typemap(jstype) unsigned char * data "byte[]"
%typemap(javaout) unsigned char * data {
    return $jnicall;
}
%typemap(out) signed char * data {
    $result = JCALL1(NewByteArray, jenv, arg1->contentLength);
    JCALL4(SetByteArrayRegion, jenv, $result, 0, arg1->contentLength, $1);
}
%typemap(in) unsigned char *data {
    $1 = (unsigned char *)JCALL2(GetByteArrayElements, jenv, $input, 0);
}
%typemap(javain) unsigned char *data "$javainput"
我有内存泄漏吗?是我弄错了还是有更可靠的方法?

或者我们可以用它来代替。像这样的方法应该会奏效:

public static class Foo extends Pointer {
    static { Loader.load(); }
    public Foo() { allocate(); }
    public Foo(Pointer p) { super(p); }
    private native void allocate();

    public native @MemberSetter void data(@Cast("unsigned char*") BytePointer data);
}

这在我看来更具可读性。

您从未收到任何调用
RelaseByteArrayElements
的消息。我想您可能想使用
memcpy
复制内容。