原文地址:《25 SWIG and Java》
25.1 概述
SWIG适用于大批量的C++接口转换成JNI,如果C++接口不多的话则没必要。
25.2 准备工作
配置、生成与编译 SWIG 自动生成代码。
25.3 C/C++ 基本包装
25.3.1 模块、包与生成Java类
SWIG不会自动生成Java包文件夹,需要外部来辅助创建。
25.3.2 函数
25.3.3 全局变量
使用 %immutable 指令可以使普通变量变成只读的(仅生成getter函数)。
25.3.4 常量
使用 #define 或 %constant 指令可以生成Java静态常量。默认情况下生成的 final static 变量是通过JNI函数来初始化的。
#define PI 3.14159 #define VERSION "1.0" %constant int FOO = 42; %constant const char *path = "/usr/local";
public interface exampleConstants { public final static double PI = exampleJNI.PI_get(); public final static String VERSION = exampleJNI.VERSION_get(); public final static int FOO = exampleJNI.FOO_get(); public final static String path = exampleJNI.path_get(); }
使用 %javaconst(flag) 来控制生成的变量形式,可以直接生成Java 常量值初始化。
%javaconst(1); %javaconst(0)BIG; %javaconst(0)LARGE; #define EXPRESSION(0x100 + 5) #define BIG 1000LL #define LARGE 2000ULL
public interface exampleConstants { public final static int EXPRESSION =(0x100 + 5); public final static long BIG = exampleJNI.BIG_get(); public final static java.math.BigInteger LARGE = exampleJNI.LARGE_get(); }
使用 %javaconstvalue(value) 来设定变量生成的初始化值形式,直接是代码串替换。
%javaconst(1); %javaconstvalue(“new java.math.BigInteger(\”2000 \“)”)LARGE; %javaconstvalue(1000)BIG; #define EXPRESSION(0x100 + 5) #define BIG 1000LL #define LARGE 2000ULL
public interface exampleConstants { public final static int EXPRESSION =(0x100 + 5); public final static BIG = 1000; public final static java.math.BigInteger LARGE = new java.math.BigInteger(“2000”); }
25.3.5 枚举
???
25.3.5.1 匿名枚举
25.3.5.2 Typesafe枚举
25.3.5.3 正确的Java枚举
25.3.5.4 类型不安全的枚举
25.3.5.5 简单枚举
25.3.6 指针
25.3.7 结构体
25.3.8 C++类
25.3.9 C++继承
25.3.10 参数传值(指针、引用、数组、传值)
25.3.10.1 空指针
25.3.11 C++重载函数
25.3.12 C++默认参数
25.3.13 C++命名空间
25.3.14 C++模板
25.3.15 C++智能指针
25.3.15.1 shared_ptr智能指针
25.3.15.2 通用智能指针
25.4 关于生成JAVA类的更多信息
25.4.1 中间JNI类
通过 %module(jniclassname="name") modulename 的指令可以指定JNI模块名称,如果不设定jniclassname则默认JNI模块名为modulenameJNI,如果设定jniclassname与modulename一致,则modulename自动会变成modulenameModule。
25.4.1.1 中间JNI类编译提示
25.4.2 Java模板类
25.4.2.1 Java模板类语法
25.4.3 Java代理类
25.4.3.1 内存管理
每个代理类都有一个所有权标志swigCMemOwn。此标志的值确定谁负责删除基础C ++对象。如果设置为true,则代理类的终结器将在代理类被垃圾回收时销毁C ++对象。如果设置为false,则代理类的销毁对C ++对象没有影响。
25.4.3.2 继承
25.4.3.3 代理类与垃圾回收
25.4.3.1 内存管理
25.4.3.1 内存管理
25.4.3.1 内存管理