使用SWIG将C++接口转换成Java接口
PS:此文章仅作为个人记录使用,代码属于私密,故无法公开;
以C++类classifier为例,文件保存于百度网盘 https://pan.baidu.com/s/1c2AwhaS(需密码)
系统:Ubuntu 15.04
参考资料:
编程中出现的错误:
java编译时出现undefined symbol:... 此种情况大部分原因是需要在原来的C++库中添加链接某lib....so文件(undefined symbol:
_ZN5boost6system15system_categoryEv)
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接口。
使用SWIG将C++接口转换成Java接口的更多相关文章
- Gson把json串转换成java实体对象
Gson把json串转换成java实体对象的方法如下: 1.首先导入Gson的jar包,网上可以下载. java实体对象如下: public class Model { private double ...
- json字符串转json对象,json对象转换成java对象
@RequestMapping(value = "updateInvestorApplyAccountNo", method = RequestMethod.POST) @Resp ...
- 转换成json字符串,与json字符串转换成java类型都要先转换成json对象
转换成json字符串,与json字符串转换成java类型都要先转换成json对象
- Protocol Buffer使用转换工具将proto文件转换成Java文件流程及使用
Client与Server的网络通信协议传输使用google protobuf,服务器端使用的是Java 一. Protocol Buffersprotobuf全称Google Protocol Bu ...
- json字符串转成 json对象 json对象转换成java对象
import com.alibaba.fastjson.JSONArray;import com.alibaba.fastjson.JSONObject; 依赖包 <dependency> ...
- 使用swig将C/C++代码转为JAVA接口(Windows平台)
小弟一直没用过Linux. 平时的码也只是在WINDOW上用SWIG或CYGWIN进行编译. 下面的例子,先从网上找来一个.c文件. example.c /* File : example.c */ ...
- 如何把 Callback 接口包装成 Promise 接口
最近一段时间一直在看Node.js,在开发过程中经常要调用一些异步接口,通常在接口的最后一个参数会传入一个回调函数,可以用来处理异常,非异常情况.大致模式如下: var fs = require(“f ...
- 简单数据访问类,生成简单SQL,自动转换成java对象
import java.util.HashMap; import java.util.List; import java.util.Map; import org.slf4j.Logger; impo ...
- [置顶] oracle 数据库表中转换成java代码
--数据库中字段java代码 select col.TABLE_NAME,replace(initcap(col.TABLE_NAME),'_', '') , 'private '||decode ...
随机推荐
- 【python】利用jieba中文分词进行词频统计
以下代码对鲁迅的<祝福>进行了词频统计: import io import jieba txt = io.open("zhufu.txt", "r" ...
- Blazor WebAssembly 3.2.0 Preview 4 如期发布
ASP.NET团队如期3.16在官方博客发布了 Blazor WebAssembly 3.2.0 Preview 4:https://devblogs.microsoft.com/aspnet/bla ...
- 怎么把jmeter汉化?
1.在Jmeter 的bin目录下找到 jmeter.properties 文件 2.找到后复制一份出来用记事本打开,Ctrl+F输入 language 定位找到 #language=en 并且把 ...
- windows VMware 安装mac 系统
0x00 下载链接 首先肯定要有镜像: 链接:https://pan.baidu.com/s/190NBRBwNXVOYRxb6nodHeA 提取码:ahq5 然后还得有这个插件: 链接:https: ...
- AQS系列(七)- 终篇:AQS总结
前言 本文是对之前AQS系列文章的一个小结,首先看看以下几个问题: 1.ReentrantLock和ReentrantReadWriteLock的可重入特性是如何实现的? 2.哪个变量控制着锁是否被占 ...
- Mac 窗口管理软件 Spectacle
我个人使用的窗口管理软件是 Magnet(本人在 Mac 下付费的首款软件,记得是 6 元~),今天为大家介绍一款类似的开源软件. 简介 Spectacle 是一款可以快速调整窗口大小与位置的开源软件 ...
- linux知识点系列之 umask
介绍 umask(user's mask)用来设置文件权限掩码.权限掩码是由3个八进制的数字所组成,将现有的存取权限减掉权限掩码后,即可产生建立文件时预设的权限. UNIX最初实现时不包含umask命 ...
- C#_关键字:Lock的解释和使用
定义 lock关键字,互斥锁,通过锁住某一对象从而将语句块({})里面的代码设置为临界区. 线程在线性执行代码时若遇到互斥锁,必须先申请互斥锁的访问权,若访问成功,则继续线性访问互斥锁后的临界区代码块 ...
- 最后の冲刺 for Alpha release 12/15/2015
好开心啊,又吃成长快乐了~ 据说release前一天,团队的工作效率会达到顶峰.亲证无效!!! release当天才是团队智力效力能力的巅峰好不好?!因为,今天,plan B:福昕pdf reader ...
- [Abp vNext 入坑分享] - 2.简化项目结构
一.简要说明 本篇文章根据我自己的需要对项目结果进行简化,让项目结构更符合我自己的要求,同时让项目跑起来.仅供参考 二.具体步骤 2.1卸载掉对我来说目前使用不上的项目,identityserver, ...