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

时间:2012-10-31 07:47:13

标签: java swig

例如,我们有以下结构:

typedef struct Foo
{
    unsigned char * data;
} Foo;

我想将data成员设置为Java字节数组(byte[])。我只想要set方法得不到。我已经阅读了getting of a member of type char * to byte array,但我无法进行设置。有人能帮助我吗?

已更新

我创建了一些类型地图,但我取得了成功:

%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"

我是否有一些内存泄漏?我做错了还是有更可靠的方式?

1 个答案:

答案 0 :(得分:0)

或者我们可以使用JavaCPP代替。这样的事情应该有效:

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);
}

这是IMO更具可读性。