如何用SWIG封装c++接口给java使用?

SWIG是什么?

SWIG(Simplified Wrapper and Interface Generator)是一个将C/C++接口转换为其他语言接口的工具,从而可以讲C/C++的库集成到其他语言的系统中。目前SWIG已经可以支持Python, Java, C#,Ruby,PHP,R语言等十多种语言。 

官方网址:

Simplified Wrapper and Interface Generatoricon-default.png?t=N7T8https://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

#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

#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

%module demo
%{
/* Includes the header in the wrapper code */
#include "apple.h"
%}/* Parse the header file to generate wrappers */
%include "apple.h"

用SWIG生成代码

swig -java -c++ apple.i

swig会生成好几个文件:

demo.java,    module名称

Apple.java,   类的实现

apple_wrap.cxx , c++的接口

demoJNI.java , JNI的接口

编译C++的接口

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

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代码

javac main.java
java -Djava.library.path=.  main

OK,运行成功了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/214959.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Redis中文结果查看方式

背景 当使用redis时我们存储到缓存中可能会包含一些中文,例如下面命令 set test 中国 当执行查看时,发现客户端显示的并不是中文而是乱码,例如下面结果 get test \xe4\xb8\xad\xe5\x9b\xbd 现对【\xe4\xb8\xad\xe5\x9b\xbd】的查看有如下几个方式 方式一:通过客户端直…

虾皮知虾数据分析软件:优化您的电商经营

在当今竞争激烈的电商市场,了解市场动态、分析竞争对手和产品趋势是成功经营的关键。虾皮知虾数据分析软件是一款强大的工具,为电商卖家提供了全面的数据采集和分析功能。本文将介绍虾皮知虾数据分析软件的特点和功能,以及如何利用它来优化您…

前端入门(三)Vue生命周期、组件技术、事件总线、

文章目录 Vue生命周期Vue 组件化编程 - .vue文件非单文件组件组件的注意点组件嵌套Vue实例对象和VueComponent实例对象Js对象原型与原型链Vue与VueComponent的重要内置关系 应用单文件组件构建 Vue脚手架 - vue.cli项目文件结构refpropsmixin插件scoped样式 Vue生命周期 1、bef…

HarmonyOS ArkTS 给应用添加通知和提醒(十二)

简介 随着生活节奏的加快,我们有时会忘记一些重要的事情或日子,所以提醒功能必不可少。应用可能需要在指定的时刻,向用户发送一些业务提醒通知。例如购物类应用,希望在指定时间点提醒用户有优惠活动。为满足此类业务诉求&#xf…

企业远程访问业务系统:对比MPLS专线,贝锐蒲公英为何更优优势?

如今,企业大多都会采用OA、ERP、CRM等各种数字化业务系统。 私有云、公有云混合架构也变得越来越常见。 比如:研发系统部署在公司本地私有云、确保数据安全,OA采用公有云方案、满足随时随地访问需求。 如此一来,也产生了远程访问…

Mysql基础操作(命令行)

文章目录 Mysql基础操作(命令行)背景创建数据库选择数据库查看所有表查看表结构向表插入数据插入第一条插入第二条插入第三条 查询表数据修改表数据删除表数据 Mysql基础操作(命令行) 背景 docker安装mysql8,映射本地…

硅光子,缘何打造量子科技的下一个十年?

/目录/ 一、硅光子技术将率先实现室温、容错量子计算机 二、用于量子科技的硅光子器件 2.1. 单光子源 2.2. 光子探测器 2.3. 波分复用技术 2.4. 低温技术 2.5. 芯片互连 三、可拓展的量子信息应用 3.1. 多光子和高维应用 3.2. 量子纠错 3.3. 量子密钥分发 3.4. 量子…

web前端开发基础------外边距折叠现象

引言 在设置样式时,需要遵循先整体再细节,先通用样式再特殊样式的顺序进行设置 一,什么是外边距折叠现象呢? 外边距折叠 定义: 外边距折叠是指相邻的两个或者多个外边距(margin)在垂直方向会合并…

【SwiftUI】7.预览及其内部机制

上一篇讲到了组件及组件化,从概念和优/缺点两个方向说明了组件化的意义,更为重要的是,组件和组件化是一个在编程领域,放之四海皆可以的概念,理解和运用它是非常必要的,希望大家能掌握。今天我们介绍另一个特…

git的使用:本地git下载、sshkey的添加、github仓库创建及文件上传

一、github创建账号 即github注册账号,登录github官网,根据提示注册即可 github官网 二、git客户端下载安装 已有很多git下载安装的博文了,在此就不赘述 三、sshkey的生成与添加 1、sshkey的生成以及查看 // sshkey的生成命令&#xff…

ThinkPHP6.1 多应用模式的一些事儿

TP安装就不说了,直接从安装完成开始了。 安装多应用模式扩展 think-multi-app composer require topthink/think-multi-app删除 app 目录下的 controller 文件夹(TP 是根据是否有这个文件夹来判断单应用模式还是多应用模式的)。 创建应用 …

vue中下载文件后无法打开的坑

今天在项目开发的时候临时要添加个导出功能我就写了一份请求加导出得代码, 代码: //导出按钮放开exportDutySummarizing (dataRangeInfo) {const params {departmentName: dataRangeInfo.name,departmentQode: dataRangeInfo.qode}//拼接所需得urlcons…