Swig for java,从c结构生成带有数组成员的代理类

时间:2012-08-23 13:29:40

标签: java arrays java-native-interface structure swig

我正在使用SWIG 2.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,因为指针和carray函数需要SWIGTYPE_p_int

我想要做的就是从代理类中正确访问数组的元素。

2 个答案:

答案 0 :(得分: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

你可以做更复杂的事情,例如使用pragma来提供一些Java重载,这些重载根据Java数组填充和设置整个数组。使用carrays.i可以做到这一点,但对于2-D阵列而言比1-D阵列更麻烦。编写一些JNI也是可能的,但作为一个二维数组,这再次增加了复杂性,使简单的%extend解决方案更具吸引力。

答案 1 :(得分:0)

仅供参考,假设您的标题文件名为Test.h,我们可以通过JavaCPP:

来完成此操作
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中:)