SWIG 转换C++接口为Java接口

    科技2026-02-22  10

    一、SWIG

    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的环境目录中即可使用。

    二、编写C++代码

    使用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文件

    SWIG需要编写一个后缀为 .i 的接口文件,把C++接口的定义写在.i文件中,也可以将C++的头文件include到.i文件中。

    在添加SWIG_CPP项目中,增加HelloWord4j.i的SWIG接口定义文件,内容如下:

    %module HelloWord4j/* 这里要设置为C++项目名称 */ %{ /* i文件中(例如变量类型)使用到的头文件 */ #include "HelloWorld.h" %} /* SWIG要解析的头文件 */ %include "HelloWorld.h"

    四、使用SWIG将C++包装成JAVA类

    1、命令行执行方式

    执行以下命令

    swig.exe -c++ -java -package com.test -outdir D:\SWIG_CPP\java HelloWord4j.i

    swig参数说明:

    -c++ -java 将C++接口转换为java接口。如果是将C接口转换为java接口,直接写 swig -java就可以。-package 生成的java类的包的名称-I HelloWord4j.i中include的.h文件的路径HelloWord4j.i swig的.i文件

    执行这条命令后,将在swig路径下生成几个文件

    HelloWord4j_wrap.cxx C++文件,包装器文件。它将C++类的方法转换为C的函数。HelloWord4j.java 这是与刚才定义的module同名的一个类。HelloWord4jJNI.java 打开这个文件可以看到,C++类的方法都转化为Java的静态方法。其他与C++类同名的Java类 每一个C++类都被转化为与之对应的Java类,并且类名,方法明完全一样。

    2、集成到VisualStudio工程方式

    打开[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

    五、编译_wrap.cxx文件为dll库

    编译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++工程。

    五、Java调用

    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)); } }

    Processed: 0.149, SQL: 9