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

一、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。
SWIG 转换C++接口为Java接口_第1张图片

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

SWIG 转换C++接口为Java接口_第2张图片
[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

SWIG 转换C++接口为Java接口_第3张图片

五、编译_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
SWIG 转换C++接口为Java接口_第4张图片

重新编译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));
	}
}

在这里插入图片描述

你可能感兴趣的:(C++,java,c++,java)