SWIG是什么?
SWIG(Simplified Wrapper and Interface Generator)是一个将C/C++接口转换为其他语言接口的工具,从而可以讲C/C++的库集成到其他语言的系统中。目前SWIG已经可以支持Python, Java, C#,Ruby,PHP,R语言等十多种语言。
官方网址:
Simplified Wrapper and Interface Generator https://www.swig.org/
https://www.swig.org/
SWIG对c/c++语言特性的支持:
ISO C99全部特性, ISO C++ 从98到11 , 14, 17。 暂时还不支持C++20的特性

SWIG支持生成的语言:
- C#
- D
- Go
- Guile
- Java
- Javascript
- Lua
- MzScheme/Racket
- OCaml
- Octave
- Perl
- PHP
- Python
- R
- Ruby
- Scilab
- Tcl
支持的平台
Unix,windows,Mac都支持。
SWIG如何使用?
1.编写swig的interface文件,指明接口的内容
2.用swig程序生成对应的接口代码
3.用gcc/g++编译生成的接口代码, 以及对应语言的代码
4.对目标语言调用接口
下面我给结合Demo.
这个Demo将cpp的代码接口转化为JAVA的代码接口。
cpp代码:
apple.h
            
            
              cpp
              
              
            
          
          #ifndef __APPLE_H__
#define __APPLE_H__
enum class LogLevel {
    Trace  /// Most detailed output
    ,Debug
    ,Info
    ,Warn
    ,Error
    ,Fatal  /// Least detailed output
    ,Current  /// no-op, value indicates current level should be retained
};
class Apple
{
public:
    Apple();
    int GetColor(void);
    void SetColor(int color);
    
private:
    int m_nColor;
};
#endif apple.cpp
            
            
              cpp
              
              
            
          
          #include "apple.h"
Apple::Apple() : m_nColor(0)
{
}
 
void Apple::SetColor(int color)
{
    m_nColor = color;
}
 
int Apple::GetColor(void)
{
    return m_nColor;
}SWIG接口文件 apple.i
            
            
              cpp
              
              
            
          
          %module demo
%{
/* Includes the header in the wrapper code */
#include "apple.h"
%}
/* Parse the header file to generate wrappers */
%include "apple.h"用SWIG生成代码
            
            
              bash
              
              
            
          
          swig -java -c++ apple.iswig会生成好几个文件:
demo.java, module名称
Apple.java, 类的实现
apple_wrap.cxx , c++的接口
demoJNI.java , JNI的接口
编译C++的接口
            
            
              bash
              
              
            
          
          g++ -fpic -shared apple_wrap.cxx  -o libapple_java.so   apple.o  \
-I/usr/lib/jvm/default-java/include \
-I/usr/lib/jvm/default-java/include/linux编写测试代码main.java
            
            
              java
              
              
            
          
          public class main {
  public static void main(String argv[]) {
    System.loadLibrary("apple_java");
    
    Apple a = new Apple();
    a.SetColor(1);
    System.out.println(a.GetColor());
  }
}编译运行java代码
            
            
              bash
              
              
            
          
          javac main.java
java -Djava.library.path=.  mainOK,运行成功了。