25.1 概要

100%纯Java的理念是值得称道的,但是在现实社会中中的程序员经常需要重用存在的代码,或者在某些情况下想要Java的便利但又不得不使用一些本地代码(C/C++的)。SWIG的Java的扩展机制可以让已经存在的C/C++代码以简单的方式继承到Java中,因为SWIG可以帮你编写Java本地代码接口(JNI)。使用javah工具与SWIG包装C/C++代码的方式不同,javah生成本地的java函数声明,创建C/C++函数原型。SWIG使用代理类包装C/C++,如果你想从java中访问大量的C/C++代码的话,这种方式非常有用。如果只有一两个函数需要包装的话,使用SWIG就显得有些大材小用了。SWIG使用从java程序中访问C/C++代码变得更容易。以前,SWIG不能生成从C++中调用java的代码。但是,现在SWIG支持语言间的多态,并且通过director特性,当包装C++的虚拟函数时,可以从C++中调用java代码。

Java是SWIG支持的语言模块中少数之一的非脚本语言。因为SWIG使用了java语言提供的类型安全,这与脚本语言使用的方式稍微有些不同。 Java语言模块中不使用特殊的运行时类型检查和运行时库。在阅读后面的内容时需要记住指点。本章关于java的内容相对来说是自包含的,它包含了使用SWIG和java过程中所有你需要了解的内容。但是,SWIG基础还是需要了解的。

本章以一些运行SWIG、编译生成的代码的例子开始。如果你减少阅读、快速上手,可以看看C/C++包装入门,了解如何从java调用C/C++代码。该节之后的内容就是包装C/C++代码到java类的各项细节。因为C/C++的非常复杂,把他们包装进java也有很多不同的方式。SWIG是一个非常强大的工具,本章剩下的内容会详细讲述默认的代码包装机制是如何工作的。其中,还介绍了很多自定义技巧和使用SWIG指令的技术。在后面的章节包含了使用typemap的高级技术,它可以用来完全控制包装过程。