swig java_使用SWIG将C++接口转换成Java接口
以C++类classifier为例,文件保存于百度网盘 https://pan.baidu.com/s/1c2AwhaS(需密码)
系统:Ubuntu 15.04
参考资料:
编程中出现的错误:
java编译时出现undefined symbol:... 此种情况大部分原因是需要在原来的C++库中添加链接某lib....so文件(undefined symbol:
java编译时出现Error: Could not find or load main class test:此种情况是因为javac -cp /home/fiona/20160419/SG_FORTESTSUCC/swig/java/myclassifier.jar test.java 未添加本地目录,应该为javac -cp .:/home/fiona/20160419/SG_FORTESTSUCC/swig/java/myclassifier.jar test.java (Error: Could not find or load main class [duplicate])
正文:
0. C++动态库编译
将classifier.cpp编译成C++动态库libclassifier.so, 并将动态库libclassifier.so放入系统的库文件中
图1 编译C++动态库
1. 利用SWIG将C++接口转换为Java接口
1.1 SWIG接口文件(.i)的编写和使用
@ SWIG需要编写一个后缀为.i的接口文件,用来指定需要从C++类中导出的接口函数;
图2 swig的接口文件
模块名由指定的%module来给出(或者用-module命令行选项)。这段指示性文字必须写在文件的头部,并且在使用时将这个模块名作为扩展模块对象来使用(此外,这个模块名经常在目标语言中被定义成一个命名空间来使用)。如果模块名在命令行已经被给出了,系统将不考虑由%module标示的模块名了。
所有在%{...%}块内的东西将被简单作为结果逐字拷贝到SWIG创建的wrapper(包装)文件中。这部分大部分被用来包括头文件和生成wrapper代码需要的其它声明。
STL/C++库的转化
这一部分的库模块提供访问部分标准C++库包括STL的方法。使SWIG支持STL还是一个正在努力中的事情。
SWIG对于一些语言模块的支持使较全面的但是对很少用到的库则支持的很少。
下面就是表示了C++类和支持的C++库 以及SWIG接口文件的对应表
C++ class C++ Library file SWIG Interface library file
std::deque deque std_deque.i
std::list list std_list.i
std::map map std_map.i
std::pair utility std_pair.i
std::set set std_set.i
std::string string std_string.i
std::vector vector std_vector.i
这个表应该说还没有很完善。一些语言模块支持上面的一个子集而另一些支持扩展的STL类.请仔细寻找相关语言库目录下的库文件。
@ 基于编写好的.i文件,使用swig命令生成java类和C++接口的wrap文件
图3 swig命令
执行$swig -c++ -java -package com.classifier -outdir ./ -I../ myclassifier.i
swig参数说明:
1)-c++ -java
告诉swig将C++接口转换为java接口。如果是将C接口转换为java接口,就不需要-c++,直接写 swig -java就可以;
2)-package
生成的java类的包的名称;
3)-I
myclassifier.i 中include的.h文件的路径。
执行swig命令后,将在swig路径下生成一下几个文件:
1)myclassifier_wrap.cxx
C++文件,包装器文件。它将C++类的方法转换为C的函数;
2)myclassifier.java
与swig中定义的module同名的java类;
3)myclassifierJNI.java
C++类中的方法在此文件中转化为Java的静态方法;
4)Classifier.java
与C++类同名的Java类,其中包含需要导出的成员函数;
5)SWIG_....java
swig将自定义的C++类型转换生成的Java类
1.2 编译myclassifier_wrap.cxx文件为.so库文件
必须的文件:jni.h, jni_md.h,刚才编译好的C++库文件libclassifier.so
图4 jni所使用的C++库的生成
需将生成的.so文件放入系统库文件夹中,jni将通过libmyclassifier.so库调用libclassifier.so库中的类和方法。
到现在为止,就通过SWIG将C++接口转换为Java接口。
2. 使用SWIG生成的Java接口
2.1 编译Java文件
进入swig目录,SWIG生成的Java文件现在都在这里。
$javac *.java
生成class文件 =》
刚才我们设定的java包是com.classifier,于是创建com/classifier目录,将class文件移动到该目录下并打包
$jar -cvf myclassifier.jar ./com生成myclassifier.jar包
图4 编译java文件
2.2 测试
需导入myclassifier.jar包,同时所使用的库文件需放在系统的库文件夹下或者指定的位置
图5 java测试程序
图6 java编译指令
至此,成功使用SWIG将C++接口转为Java接口。
原文:http://www.cnblogs.com/tanfy/p/5408472.html
swig java_使用SWIG将C++接口转换成Java接口相关推荐
- java.util.Date转换成java.sql.Date
// 获取当前的系统时间,以java.util.Date对象返回 Date dateUtil = new Date(); // 获取当前的系统时间,以时间戳返回 long l = System.cur ...
- JSP文件如何转换成Java文件?
文章目录 jsp 文件如何转换成 java 文件 jsp 何时开始编译 jsp 编译后的文件存储目录 jsp 文件如何转换成 java 文件 html ...
- gson java 对象_Gson把json串转换成java实体对象
Gson把json串转换成java实体对象的方法如下: 1.首先导入Gson的jar包,网上可以下载. java实体对象如下: public class Model { private double ...
- json字符串转成 json对象 json对象转换成java对象
import com.alibaba.fastjson.JSONArray;import com.alibaba.fastjson.JSONObject; 依赖包 <dependency> ...
- 把AdobeIllustrator导出的SVG矢量图,自动转换成java代码或BufferedImage对象,这种需求多吗?
Adobe Illustrator画的矢量图可以在任何像素下清晰显示图片,可以适配任何像素的显示器,自动识别图片内容然后转换成java代码的图片类,这种需求多吗?也可以自动读取矢量图,转换成Buffe ...
- 将数据库字段转换成java字段
//将数据库字段databaseField转换成java字段 static String databaseField = "id\n" +"table_name\n&qu ...
- 如何实现get接口与post接口转换,get接口与post接口如何转换
如何实现get接口与post接口转换 原创作者:杰哥不会飞 找到要修改类型的接口位置,将@PutMapping或者@GetMapping修改为想要的请求接口类型 @ApiOperation(" ...
- 海康视频回放,rtsp视频接口转换成.m3u8格式文件
通过海康接口返回的rtsp视频接口,转换成.m3u8格式文件,逻辑如下 1.采用ffmpeg实时转化rtsp链接视频,转化为m3u8,存放服务器固定地址 2.采用nginx代理视频出.m3u8视频链接 ...
- doc转换成html接口,九云图文档转换接口在线word转pdf,pdf转html,doc转pdf等各种文档相互转换的接口...
当前,针对文档的 WEB 展现,特别是在移动端 WEB 展现,缺少成熟通用的技术方案.一些应用不得不采取变通的办法,比如阿里钉钉把文档页转成了图片.QQ 邮箱丢失字体轮廓特征.微信则要下载后通过第三方 ...
最新文章
- 2021年大数据Flink(二):Flink用武之地
- arm编译安装openCV整理
- GVA gin vue从后端接口获取多选下拉框数据
- 什么是java?为什么大家都学习java技术?
- 两款【linux字符界面下】显示【菜单】,【选项】的powershell脚本模块介绍
- CLR Dynamic Languages
- 力扣删除排序数组中的重复项 II
- ubuntu18.04安装mysql8
- 计算机技术与自动化期刊官网,计算技术与自动化是什么级别
- php+js+return+true,js中return、return false、return true的区别
- 7、JsonCpp简单使用(3)
- Windows Server 2016 Technical Preview 4 (x64) 简体中文版下载!
- Javascript:遍历json数据的方法
- 生产车间仿真软件flexSIM
- 什么是自适应学习(个性化学习)?
- Solana中的account
- python中的exifread库只要一张图片就能获取你的精确位置
- 使用Arduino读取RC接收机PWM信号的三种方式
- Python爬取pilipili排行榜
- imchat视频聊天室 linux,基于Nuxt+Vant聊天模板|nuxt.js仿微信界面|红包|朋友圈