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

SWIG 转换C++接口为Java接口相关推荐

  1. swig c java gemt,利用 SWIG 转换 C/C++ 接口到 Java 接口

    SWIG(Simplified Wrapper and Interface Generator)是一个将C/C++接口转换为其他语言接口的工具,从而可以讲C/C++的库集成到其他语言的系统中.目前SW ...

  2. 微信公众开放平台开发02---微信公众平台PHP接口和java接口对比

    微信公众开放平台开发02---微信公众平台PHP接口和java接口对比 技术qq交流群:JavaDream:251572072 ----------------------------------- ...

  3. 通达信交易接口函数Java接口抽象法

    通达信交易接口函数Java接口抽象法,在package cn.itcast.day10.demo01:在任何版本的Java中,接口都能定义抽象方法.

  4. java 抽象接口类,Java接口(interface)和Java抽象类(abstract class)的区别(详诉版)

    1.概述 一个软件设计的好坏,我想很大程度上取决于它的整体架构,而这个整体架构其实就是你对整个宏观商业业务的抽象框架, 当代表业务逻辑的高层抽象层结构合理时,你底层的具体实现需要考虑的就仅仅是一些算法 ...

  5. php接口和java接口_java和php接口的区别是什么

    java和php接口的区别是:1.php接口中的抽象方法只能是public的,默认也是public权限:2.java中私有方法使用private修饰,供接口中的默认方法或者静态方法调用. [相关学习推 ...

  6. java 接口入门,Java接口入门教程解读

    Java接口入门教程解读,学习Java技术开发是一个长期的过程,今天小编介绍Java接口相关知识内容 接口 是Java语言中一种引用类型,是方法的集合,如果说类的内部封装了成员变量.构造方法和成员方法 ...

  7. swig java_使用SWIG将C++接口转换成Java接口

    以C++类classifier为例,文件保存于百度网盘 https://pan.baidu.com/s/1c2AwhaS(需密码) 系统:Ubuntu 15.04 参考资料: 编程中出现的错误: ja ...

  8. Java 接口基础详解,java开发面试笔试题

    我总结出了很多互联网公司的面试题及答案,并整理成了文档,以及各种学习的进阶学习资料,免费分享给大家. 扫描二维码或搜索下图红色VX号,加VX好友,拉你进[程序员面试学习交流群]免费领取.也欢迎各位一起 ...

  9. java接口_Java接口

    java接口 Interface in java is one of the core concept. Java Interface is core part of java programming ...

  10. Java 接口+继承

    接口 在JAVA编程语言中是一个抽象类型,是抽象方法的集合,接口通常以interface来声明.一个类通过继承接口的方式,从而来继承接口的抽象方法. 接口并不是类,编写接口的方式和类很相似,但是它们属 ...

最新文章

  1. GPU环境配置指南(Ubuntu16.04+CUDA+CUDNN)
  2. 基于JAVA+SpringMVC+MYSQL的求职招聘管理系统
  3. ShaderLab学习小结(四)简单产生阴影
  4. 当post 的字段很多,post的字段并不完全修改(有的值是前端input的值,有的任保留原来原来数据库的值),...
  5. 第四季-专题1-课程规划与学习方法
  6. 765. 情侣牵手--(每日一难phase2--day14)
  7. ios苹果越狱教程(奥德赛)
  8. 计算机组成基础(2)-- 微体系结构层
  9. torch.device用法总结
  10. Codeforces - Inna and Dima
  11. CSS去除input框自带的叉号
  12. python 无法使用Ctrl-C终止Python脚本(ctrl+c 退出while True)
  13. 冒烟测试和回归测试的区别
  14. 统计学基础5-多维随机变量及其分布
  15. http keep-live
  16. 给自己的网站加入智能聊天功能
  17. 如何将项目使用docker分块部署
  18. 过去66年的66项最佳发明(1964~1993)
  19. springboot+vue+java廉租房屋维修申请系统
  20. Check Point R75,R77 gaia expert 密码重置

热门文章

  1. linux halt 命令详解
  2. 要突破技术瓶颈?80%的人忽略了这个因素
  3. Soft-Skills-software-developers-manual
  4. Android 蓝牙扫描
  5. VSAN 和 VDP 的互操作
  6. Linux如何使用GPG(GNU Privacy Guard)对信息/文件进行加密和解密
  7. 5.性能之巅 洞悉系统、企业与云计算 --- 应用程序
  8. 5.go 代码包 package
  9. 27.Yii App应用
  10. 21. PHP 表单验证 - 完成表单实例