1

私はSWIG2.0を使用しており、APIのJavaラッパーを作成しています。このAPIの一部として、多次元配列を含む構造があります。

typedef struct mbuf
{
  data[2][31]
}

プロキシクラスを生成すると、配列へのポインタを取得するための関数が提供されます。

public void setData_buf_num1(int value) {
    apiJNI.MBUF_data_buf_num1_set(swigCPtr, this, value);
  }

  public int getData_buf_num1() {
    return apiJNI.MBUF_data_buf_num1_get(swigCPtr, this);
  }

他のC関数に渡すことができる読み取り専用ポインターが返されることを理解しています。carray.iを使用してアクセスを許可しようとしましたが、運がありませんでした。

intポインター関数とキャリー関数が必要とする関数が返されるため、キャストを機能させることができませんでしたSWIGTYPE_p_int

私がやりたいのは、プロキシクラスから配列の要素に適切にアクセスすることだけです。

4

2 に答える 2

1

Java 内のデータを読み取るだけの場合、最も簡単な方法は、dataメンバーを完全に非表示%extendにして、配列内の特定のエントリを読み取るメソッドを追加することです。次のように SWIG を使用してこれを行うことができます。

%module test

%ignore mbuf::data; 

%inline %{
struct mbuf
{
  int data[2][31];
};
%}

%extend mbuf {
  int getData(int i, int j) {
    return $self->data[i][j];
  }
}

setData必要に応じて、同じ方法で追加できます。

たとえば、プラグマを使用して、Java 配列に基づいて配列全体を設定および設定する Java オーバーロードを提供するなど、より洗練された処理を行うことができます。carrays.i を使用してこれを行うことは可能ですが、1 次元配列よりも 2 次元配列の方が面倒です。一部の JNI を作成することも可能ですが、2 次元配列であるため、単純な%extendソリューションがより魅力的になります。

于 2012-08-23T13:40:28.237 に答える
0

参考までに、ヘッダーファイルの名前がであると仮定すると、 JavaCPPTest.hを使用してこれを行う方法は次のとおりです。

import com.googlecode.javacpp.*;
import com.googlecode.javacpp.annotation.*;

@Platform(include="Test.h")
public class Test {
    public static class mbuf extends Pointer {
        static { Loader.load(); }
        public mbuf()          { allocate(); }
        public mbuf(int size)  { allocateArray(size); }
        public mbuf(Pointer p) { super(p); }
        private native void allocate();
        private native void allocateArray(int size);

        public native int data(int i, int j); 
        public native mbuf data(int i, int j, int k);
    }

    public static void main(String[] args) {
        mbuf m = new mbuf();
        m.data(1, 2, 42);
        System.out.println(m.data(1, 2));
    }
}

もう少し定型的ですが、少なくともJavaでは:)

于 2012-09-18T13:01:34.230 に答える