如何使用swig调用C函数期望来自Java的结构数组?

时间:2012-09-27 14:49:29

标签: java c swig

我有一个C函数,它接受一个结构数组作为参数,我想通过SWIG从Java调用这个函数,但文档在这个主题上似乎很模糊,我找不到任何stackoverflow问题直接解决这种情况。这是一个类似于我想要做的例子:

C头文件:

typedef struct {
  int timeToPayment;
  double paymentAmount;
} Payment;
double presentValue(Payment *payments, int nPayments);

Java code snippet:

...
Class Payment {
  public int timeToPayment;
  public double paymentAmount;
};
...
Payment[] payments = new Payment[3];
payments[0].timeToPayment = 30;
payments[0].paymentAmount = 1.0;
payments[1].timeToPayment = 60;
payments[1].paymentAmount = 2.0;
payments[2].timeToPayment = 90;
payments[2].paymentAmount = 3.0;
double pv = CLIBRARY.presentValue(payments);
// also acceptable: double pv = CLIBRARY.presentValue(payments, payments.length);

如何实现这一目标?

编辑:为了提供附加信息,SWIG是一项要求,因为它已经被用于将更简单的接口合并到同一个Java代码库中,并且支持多种方法来解决这个问题是不可接受的。此外,C函数的签名不能改变,这个例子已经非常简化;实际问题涉及多个C函数,签名需要结构数组(在某些情况下有多个不同结构的数组),而且有些结构非常大,所以我真的非常希望不必将它们分解成等效的数组原始类型。

1 个答案:

答案 0 :(得分:0)

最后,我无法完成这项工作(虽然我并不是说不可能这样做),我在C中创建了一个转换层,它将所有内容包装到单个结构中,然后再通过它