我正在使用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
。
我想要做的就是从代理类中正确访问数组的元素。
答案 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中:)