1

我正在使用 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按照指针和数组函数的要求返回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以相同的方式添加。

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

于 2012-08-23T13:40:28.237 回答
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 中:)

于 2012-09-18T13:01:34.230 回答