2

たとえば、次の構造があります。

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

dataメンバーに Java バイト配列 ( )を設定したいbyte[]。getではなくsetメソッドのみが必要です。char * 型のメンバーをバイト配列に取得することを読みましたが、設定を行うことができません。誰でも私を助けることができますか?

更新:

いくつかの型マップを作成しましたが、成功しました:

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

メモリリークがありますか?私はそれを間違えましたか、それとももっと信頼できる方法がありますか?

4

1 に答える 1

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の方がはるかに読みやすいです。

于 2012-11-06T10:33:22.157 に答える