[英]Swig for java, generating a proxy class from c structure with array member
我正在使用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給我訪問權限,但是沒有運氣,
我無法執行強制SWIGTYPE_p_int
因為我的函數返回int
因為指針和carray函數需要SWIGTYPE_p_int
。
我要做的就是從代理類正確訪問數組的元素。
如果您要做的只是讀取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可以做到這一點,但是2-D數組比1-D數組麻煩。 也可以編寫一些JNI,但是如果是2-D數組,這又會增加復雜性,從而使簡單的%extend
解決方案更具吸引力。
僅供參考,假設您的頭文件名為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中是這樣的:)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.