注意到.i接口文件中定义的组件仅仅是为了SWIG来让java可以访问。他们并不会包含在产生的文件中,除非他们也被定义插入预处理定义中。
全局变量:
swig支持全局变量。SWIG产生getter和setter方法在模块类中来提供获得本地全局的变量。为了让全局变量被Java获得,增加它到接口文件。
%module Unix
. . .
/* Global counter. */
extern int value;
. . .
public static void setCounter(int value) {
UnixJNI.counter_set(value);
}
public static int getCounter() {
return UnixJNI.counter_get();
}
}
常量的定义:
常量被定义在接口文件,通过#define或者%constant预处理命令
%module Unix
. . .
/* Constant using define directive. */
#define MAX_WIDTH 640
/* Constant using %constant directive. */
%constant int MAX_HEIGHT = 320;
SWIG产生一个Java接口命名为<module>Contant,和常量被展示作为静态常量变量在这个接口中:
public interface UnixConstants {
public final static int MAX_WIDTH = UnixJNI.MAX_WIDTH_get();
public final static int MAX_HEIGHT = UnixJNI.MAX_HEIGHT_get();
}
默认Swig产生运行时常量。通过JNI函数调用本地代码来初始化这些常量。这可以被改变通过使用这%javaconst预处理在接口文件,如下:
%module Unix
. . .
/* Constant using define directive. */
%javaconst(1);
#define MAX_WIDTH 640
/* Constant using %constant directive. */
%javaconst(0);
%constant int MAX_HEIGHT = 320;
这个预处理指令命令SWIG来产生编译时常量对于Max_WIDTH和一个运行时常量对于Max_Height.这个Java接口如下:
package com.apress.swig;
public interface UnixConstants {
public final static int MAX_WIDTH = 640;
public final static int MAX_HEIGHT = UnixJNI.MAX_HEIGHT_get();
}
只读变量:
SWIG提供这个%immutable预处理指令来标记一个只读变量,如下:
%module Unix
. . .
/* Enable the read-only mode. */
%immutable;
/* Read-only variable. */
extern int readOnly;
/* Disable the read-only mode. */
%mutable;
Setter Method Is Not Generated for the Read-only Variable
. . .
public static int getReadOnly() {
return UnixJNI.readOnly_get();
}
public static void setReadWrite(int value) {
UnixJNI.readWrite_set(value);
}
public static int getReadWrite() {
return UnixJNI.readWrite_get();
}
}
枚举类型:
SWIG能够处理命名的和匿名的枚举变量。产生枚举变量有四种不同的方式:
匿名:
匿名枚举被定义在接口文件,如下:
%module Unix
. . .
/* Anonymous enumeration. */
enum { ONE = 1, TWO = 2, THREE, FOUR };
Swig在产生静态变量的<Module>Constants的Java接口对于每个enumeration,如下。想常量一样也产生运行时枚举常量。这个%javaconst预处理也能够产生编译时枚举常量。
package com.apress.swig;
public interface UnixConstants {
. . .
public final static int ONE = UnixJNI.ONE_get();
public final static int TWO = UnixJNI.TWO_get();
public final static int THREE = UnixJNI.THREE_get();
public final static int FOUR = UnixJNI.FOUR_get();
}
类型安全:
不像匿名的枚举常量,他们在Java中作为类型安全的枚举常量。
%module Unix
. . .
/* Named enumeration. */
enum Numbers { ONE = 1, TWO = 2, THREE, FOUR };
SWIG定义了一个带有枚举的名字的单独类和枚举值被展示为一个不变的静态的成员属性,如下:
package com.apress.swig;
public final class Numbers {
public final static Numbers ONE = new Numbers("ONE", UnixJNI.ONE_get());
public final static Numbers TWO = new Numbers("TWO", UnixJNI.TWO_get());
public final static Numbers THREE = new Numbers("THREE");
public final static Numbers FOUR = new Numbers("FOUR");
. . .
/* Helper methods. */
. . .
}
enumtypeunsafe.swg的扩展名:
%include "enumtypeunsafe.swg"
/* Named enumeration. */
enum Numbers { ONE = 1, TWO = 2, THREE, FOUR };
产生的对于枚举类型的Java类如下。这种类型的枚举能够用作switch语句,因为他们是基于常量的。
package com.apress.swig;
public final class Numbers {
public final static int ONE = UnixJNI.ONE_get();
public final static int TWO = UnixJNI.TWO_get();
public final static int THREE = UnixJNI.THREE_get();
public final static int FOUR = UnixJNI.FOUR_get();
}
Java的枚举类型:
对于Java的枚举类型,也能够展示个Java。这种类型的枚举也是类型检查的,和他们能够用在switch语句中。命名的枚举变量能够标记为Java枚举通过包含enums.swg的扩展,如下:
%module Unix
. . .
/* Java enumeration. */
%include "enums.swg"
/* Named enumeration. */
enum Numbers { ONE = 1, TWO = 2, THREE, FOUR };
package com.apress.swig;
public enum Numbers {
ONE(UnixJNI.ONE_get()),
TWO(UnixJNI.TWO_get()),
THREE,
FOUR;
. . .
/* Helper methods. */
. . .
}
结构体:
结构体也被SWIG支持,和他们被定义在接口文件,如下:
%module Unix
. . .
/* Point structure. */
struct Point {
int x;
int y;
};
他们能够通过getter和setter对于成员变量来封装,如下:
package com.apress.swig;
public class Point {
private long swigCPtr;
protected boolean swigCMemOwn;
protected Point(long cPtr, boolean cMemoryOwn) {
swigCMemOwn = cMemoryOwn;
swigCPtr = cPtr;
}
protected static long getCPtr(Point obj) {
return (obj == null) ? 0 : obj.swigCPtr;
}
protected void finalize() {
delete();
}
public synchronized void delete() {
if (swigCPtr ! = 0) {
if (swigCMemOwn) {
swigCMemOwn = false;
UnixJNI.delete_Point(swigCPtr);
}
swigCPtr = 0;
}
}
public void setX(int value) {
UnixJNI.Point_x_set(swigCPtr, this, value);
}
public int getX() {
return UnixJNI.Point_x_get(swigCPtr, this);
}
public void setY(int value) {
UnixJNI.Point_y_set(swigCPtr, this, value);
}
public int getY() {
return UnixJNI.Point_y_get(swigCPtr, this);
}
public Point() {
this(UnixJNI.new_Point(), true);
}
}