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"