美文网首页
2019-02-01 使用swig转化C++到Java

2019-02-01 使用swig转化C++到Java

作者: Calvin张弛 | 来源:发表于2019-02-01 11:30 被阅读0次

    1. 写一个swig的interface.i文件

    2. swig -c++ -java interface_file.i

    *如果是要让输出的java文件可以放进package里那么要这样写:

    swig -c++ -java -package <具体package名> interface_file.i

    3. g++ -fpic -c x.cpp y.cpp x_wrap.cpp

    *这条语句可能出现以下错误:

    1).error: #error This file requires compiler and library support for the ISO C++ 2011 standard. This support must be enabled with the -std=c++11 or -std=gnu++11 compiler options.

    这个错误的解决方法是在g++后面加上-std=c++11

    2). fatal error: jni_md.h: No such file or directory(或者jni.h)

    这个错误说明g++编译器没有找到这个头文件,所以我们需要手动把这个(这个两个文件)的具体为止告诉g++。

    找文件的方法是:先找到jdk的位置,比如/usr/lib/jdk/jdk1.8.0_171,然后里面有include文件夹。jni.h在这个include文件夹,jni_md.h在include/linux下。

    然后我们需要显示的告诉g++,方法是在g++后面加上-I 关键字。

    下面命令是对应我电脑的解决以上两个问题的整体命令:

    g++ -std=c++11 -I /usr/lib/jvm/java-8-openjdk-amd64/include -I /usr/lib/jvm/java-8-openjdk-amd64/include/linux/ -fpic -c LocMsg.cxx LocMsgPublisher.cxx LocMsgPubSubTypes.cxx LocMsgSubscriber.cxx interface_wrap.cxx 其中cxx文件依据自己项目改变。

    4. g++ -shared x.o y.o x_warp.o -o libOutput.so

    生成so文件,生成之后把该文件移动到/usr/lib中

    如果需要链接其他第三方动态库的话,需要在上面这条命令中加入-l<动态库名字(去掉lib和.so的部分)>,加几个动态库就写几个。更多关于链接库的基本知识可以参考这篇博客:https://blog.csdn.net/surgewong/article/details/39236707

    比如:g++ -shared LocMsg.o LocMsgPubSubTypes.o LocMsgPublisher.o LocMsgSubscriber.o interface_wrap.o -lfastcdr -lfastrtps -o libLocMsg.so 其中fastcdr和fastrtps为名为libfastcdr.so和libfastrtps.so的动态库。

    5. javac x.java

    如果出现有的类型无法转换的情况,比如 incompatible types: String cannot be converted to SWIGTYPE_p_std__string,需要在interface.i中加入:

    %include "std_string.i"

    6. java x

    相关文章

      网友评论

          本文标题:2019-02-01 使用swig转化C++到Java

          本文链接:https://www.haomeiwen.com/subject/qoorsqtx.html