簡體   English   中英

Swig for Java,使用數組成員從c結構生成代理類

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM