zoukankan      html  css  js  c++  java
  • 使用SWIG将C++接口转换成Java接口

    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接口。

  • 相关阅读:
    input()和print()函数同时输入输出多个数据--python3
    2018-海信-算法工程师-面试问题
    2018-CVTE中央研究院-自然语言处理算法工程师-电话面问题
    windows服务demo
    C#获取刚插入的数据的id
    .net微软企业库的事务回滚
    C# NPOI的数据批量导入数据库
    C# 使用复选框实现循环添加多条信息入库!
    C# DataSet与DataTable的区别和用法
    C#如何编写短信接口,以及接口的调用,包括C#.net访问web,并处理返回值的简例。
  • 原文地址:https://www.cnblogs.com/tanfy/p/5408472.html
Copyright © 2011-2022 走看看