使用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
复制内容。