PS:此文章仅作为个人记录使用,代码属于私密,故无法公开;

以C++类classifier为例,文件保存于百度网盘 https://pan.baidu.com/s/1c2AwhaS(需密码)

系统:Ubuntu 15.04

参考资料:

ubuntu源码安装swig

利用swig转换C++接口到Java接口

SWIG3.0说明文档

编程中出现的错误:

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接口的更多相关文章

  1. Gson把json串转换成java实体对象

    Gson把json串转换成java实体对象的方法如下: 1.首先导入Gson的jar包,网上可以下载. java实体对象如下: public class Model { private double ...

  2. json字符串转json对象,json对象转换成java对象

    @RequestMapping(value = "updateInvestorApplyAccountNo", method = RequestMethod.POST) @Resp ...

  3. 转换成json字符串,与json字符串转换成java类型都要先转换成json对象

    转换成json字符串,与json字符串转换成java类型都要先转换成json对象

  4. Protocol Buffer使用转换工具将proto文件转换成Java文件流程及使用

    Client与Server的网络通信协议传输使用google protobuf,服务器端使用的是Java 一. Protocol Buffersprotobuf全称Google Protocol Bu ...

  5. json字符串转成 json对象 json对象转换成java对象

    import com.alibaba.fastjson.JSONArray;import com.alibaba.fastjson.JSONObject; 依赖包 <dependency> ...

  6. 使用swig将C/C++代码转为JAVA接口(Windows平台)

    小弟一直没用过Linux. 平时的码也只是在WINDOW上用SWIG或CYGWIN进行编译. 下面的例子,先从网上找来一个.c文件. example.c /* File : example.c */ ...

  7. 如何把 Callback 接口包装成 Promise 接口

    最近一段时间一直在看Node.js,在开发过程中经常要调用一些异步接口,通常在接口的最后一个参数会传入一个回调函数,可以用来处理异常,非异常情况.大致模式如下: var fs = require(“f ...

  8. 简单数据访问类,生成简单SQL,自动转换成java对象

    import java.util.HashMap; import java.util.List; import java.util.Map; import org.slf4j.Logger; impo ...

  9. [置顶] oracle 数据库表中转换成java代码

    --数据库中字段java代码 select col.TABLE_NAME,replace(initcap(col.TABLE_NAME),'_', '')   , 'private '||decode ...

随机推荐

  1. shell脚本实现自动压缩一天前的日志文件 ,并传到ftp服务器上

    shell脚本实现自动压缩一天前的日志文件 ,并传到ftp服务器上 naonao_127关注2人评论19401人阅读2012-06-08 11:26:16         生产环境下脚本自动备份脚本是 ...

  2. MariaDB使用数据库查询《三》

                                                                 MariaDB使用数据库查询 案例5:使用数据库查询 5.1 问题 本例要求配 ...

  3. SI24R2F新一代2.4G超低功耗单发射有源RFID芯片 SI24R2E升级版智能充电安全管理方案首选

    目前全国有很多电动车因在充电时电池温度过高,而导致爆炸引起火灾的情况.作为国内RFID行业的推动者,动能世纪联合中科微向IOT应用领域推出新款大功率2.4G射频芯片,并针对电动车防盗.电动车充电桩市场 ...

  4. JAVA自动化之Junit单元测试框架详解

    一.JUnit概述&配置 1.Junit是什么? Junit是一个Java 编程语言的开源测试框架,用于编写和运行测试.官网 地址:https://junit.org/junit4/ 2.Ma ...

  5. CVPR2018关键字分析生成词云图与查找

    今日目标:爬取CVPR2018论文,进行分析总结出提到最多的关键字,生成wordCloud词云图展示,并且设置点击后出现对应的论文以及链接 对任务进行分解: ①爬取CVPR2018的标题,简介,关键字 ...

  6. CDR

    伴随着新经济.独角兽一同被热议的,中国将很快推出存托凭证迎接独角兽回归.中国存托凭证(CDR)已成为当下热门话题.说不清CDR,还能和小伙伴们愉快地聊天吗? CDR到底是什么?它具有哪些优势?能否带来 ...

  7. MySQL REPLACE INTO 的使用

    前段时间写游戏合服工具时出现过一个问题,源DB和目标DB角色表中主键全部都不相同,从源DB取出玩家数据再使用 replace into 写入目标DB中,结果总有几条数据插入时会导致目标DB中原有的角色 ...

  8. "着重内容"组件:<strong> —— 快应用组件库H-UI

     <import name="strong" src="../Common/ui/h-ui/text/c_tag_b"></import&g ...

  9. python3(五) if

    age = 20 if age >= 18: print('your age is', age) print('adult') # 如果if语句判断是True,就把缩进的两行print语句执行了 ...

  10. MySQL中group_concat函数 --- 很有用的一个用来查询出所有group by 分组后所有 同组内的 内容

    本文通过实例介绍了MySQL中的group_concat函数的使用方法,比如select group_concat(name) . MySQL中group_concat函数 完整的语法如下: grou ...