Simplified Wrapper and Interface Generator (SWIG) 是一个开源的,C或C++编写的软件与其它各种高级编程语言进行嵌入包装的开发工具。
SWIG能应用于各种不同类型的语言。包括常用脚本编译语言,例如Perl, PHP, Python, Ruby。也包括非脚本编译语言,例如C#, Common Lisp (CLISP, Allegro CL, CFFI, UFFI), Java, Modula-3, OCAML以及R,甚至是编译器或者汇编的应用。
SWIG可以被自由使用,发布,修改用于商业或非商业中。
可以下载它的源码自己编译,也可以直接下载编译好的二进制包。如果没有啥特殊的需求,使用编译好的EXE就可以了。
下载地址SWIG,官方文档,解压并将其目录加到PATH的环境目录中即可使用。
使用VisualStudio,新建C++[Win32 Project]工程,名称为SWIG_CPP
ApplicationType选择DLL
Additional Options选择Empty Project
其它默认。
添加HelloWorld.h文件,文件内容如下
#pragma once
/* C++对象方法*/
class HelloWorld
{
public:
int add(int a, int b);
};
/*全局函数*/
int multiply(int a, int b);
添加HelloWorld.cpp文件,文件内容如下
#include "HelloWorld.h"
int HelloWorld::add(int a,int b)
{
return a + b;
}
int multiply(int a, int b)
{
return a*b;
}
VisualStudio Win32 Project默认的是Win32模式,现在我们把它改为64位模式。
因为JDK是64位,默认Java项目只能调用64位动态链接库,所以需要把C++工程的Platform从Win32改为x64。
SWIG需要编写一个后缀为 .i 的接口文件,把C++接口的定义写在.i文件中,也可以将C++的头文件include到.i文件中。
在添加SWIG_CPP项目中,增加HelloWord4j.i的SWIG接口定义文件,内容如下:
%module HelloWord4j/* 这里要设置为C++项目名称 */
%{
/* i文件中(例如变量类型)使用到的头文件 */
#include "HelloWorld.h"
%}
/* SWIG要解析的头文件 */
%include "HelloWorld.h"
执行以下命令
swig.exe -c++ -java -package com.test -outdir D:\SWIG_CPP\java HelloWord4j.i
swig参数说明:
执行这条命令后,将在swig路径下生成几个文件
打开[HelloWord4j.i]的属性页,设置自定义编译方式。
[Configuration Properties]->[General]->[Item Type]中,选择[CustomBuild Tool],点击OK。
再打开HelloWord4j.i文件的属性页,[Configuration Properties]->[Custom BuildTool]->[General]->[Command Line],输入框中输入下面5行内容:
echo Invoking SWIG...
echo on
swig.exe -c++ -java -package com.test -outdir D:\SWIG_CPP\java %(FullPath)
echo off
[Configuration Properties]->[CustomBuild Tool]->[General]->[Outputs]输入框中输入下面一行内容:
%(Filename)_wrap.cxx
这样编译HelloWord4j.i文件就会调用SWIG.EXE程序,生成HelloWord4j_wrap.cxx文件和java包装文件。
打开SWIG_CPP项目的属性页,[Configuration Properties]->[Build Events]->[Post BuildEvent]->[Command Line]输入框中输入下面的三行内容
echo on
copy "$(OutDir)$(ProjectName).dll" "D:\SWIG_CPP\java"
echo off
编译HelloWord4j.i文件后,把生成的HelloWord4j_wrap.cxx文件加入到当前C++项目中。
HelloWord4j_wrap.cxx需要用到jni的头文件jni.h
找到机器上jdk安装目录,
C:\Program Files\Java\jdk1.8.0_201\include和
C:\Program Files\Java\jdk1.8.0_201\include\win32
重新编译C++工程。
package com.test;
public class SwigJava {
static {
//DLL的名称
System.loadLibrary("SWIG_CPP");
}
public static void main(String[] args)
{
HelloWorld obj = new HelloWorld();
System.out.println("对象方法调用=>"+obj .add(1, 2));
System.out.println("全局函数调用=>"+HelloWord4j.multiply(2, 3));
}
}