2

我正在使用 Cent OS、SWIG 1.3 并且我已经测试过从 SWIG 示例编译示例 Java 示例。它包括:

例子.c

/* A global variable */
double Foo = 3.0;

/* Compute the greatest common divisor of positive integers */
int gcd(int x, int y) {
  int g;
  g = y;
  while (x > 0) {
    g = x;
    x = y % x;
    y = g;
  }
  return g;
}

例子.i

%module example

extern int gcd(int x, int y);
extern double Foo;

然后我使用命令:

swig -java example.i

然后我编译生成的 example_wrap.c:

gcc -c example_wrap.c -I/usr/java/jdk1.6.0_24/include -I/usr/java/jdk1.6.0_24/include/linux

我有以下错误:

example_wrap.c: In function ‘Java_exampleJNI_Foo_1set’:
example_wrap.c:201: error: ‘Foo’ undeclared (first use in this function)

example.i 文件是错误的还是我没有完成某些事情?或者这是 SWIG 中的错误?有解决方法吗?

4

1 回答 1

4

您已告诉 SWIG 将声明函数和全局变量,但您需要确保该声明在生成的包装器代码中可见。gcd(如果您没有为 gcc 使用更高的警告设置,您可能还会收到关于 的隐式声明的警告)

解决方案是使该声明可见,最简单的方法是:

%module example

%{
// code here is passed straight to example_wrap.c unmodified
extern int gcd(int x, int y);
extern double Foo;
%}

// code here is wrapped:
extern int gcd(int x, int y);
extern double Foo;

就我个人而言,我会添加一个 example.h 文件,其中包含这些声明并制作模块文件:

%module example

%{
// code here is passed straight to example_wrap.c unmodified
#include "example.h"
%}

// code here is wrapped:
%include "example.h"

在 example.c 中有一个相应的包含以进行良好的衡量。

另一种写法是:

%module example

%inline %{
  // Wrap and pass through to example_wrap.c simultaneously
  extern int gcd(int x, int y);
  extern double Foo;  
%}

但通常我只建议使用%inline您要包装的内容特定于包装过程而不是您要包装的库的一般部分的情况。

于 2012-07-30T13:31:59.637 回答