测试环境:swig2.0.1,redhat7.6,jdk1.8
一、 查看是否安装及版本
rpm -q swig
swig -version
二、 下载、编译和安装swig开发工具
wget "http://sourceforge.net/projects/swig/files/swig/swig-2.0.1/swig-2.0.1.tar.gz/download"
图片说明
若有旧版本,需卸载:查询旧版:rpm -q swig
卸载旧版:rpm -e swig-xxxxxx
1、 解压: tar zxf swig-2.0.1.tar.gz
2、 进入根目录cd swig-2.0.1/
图片说明
3、 配置文件:./configure --prefix=/usr 然而出现报错:
图片说明
缺少C的编译器,解决办法:安装GCC软件套件:yum install gcc
然而,接着又出现一个错误:
图片说明
configure报错了,缺少pcre开发包。(PCRE = Perl Compatible Regular Expressions)到Linux安装盘中找pcre开发包。解决办法:若没有pcre包,则安装包,可以用locate pcre查看安装位置 若有则指定路径:./configure --prefix=/usr/lib64
安装pcrepcre-8.10.tar.gz
a解压:tar -zxvf pcre-8.10.tar.gz
b进入根目录:cd pcre-8.10
c若无g++,先安装:yum -y install gcc+ gcc-c++ 然后执行:./configure --disable-shared --with-pic
d最后make && make install
重新配置Swig: ./configure --prefix=/usr,成功!
图片说明
4、 编译、安***r>make
图片说明
make install
图片说明
查看安装是否成功及版本:swig –version
图片说明
三、 测试用例
文件 example.c
/* File : example.c */

#include
double My_variable = 3.0;

int fact(int n) {
if (n <= 1) return 1;
else return n*fact(n-1);
}

int my_mod(int x, int y) {
return (x%y);
}

char get_time()
{
time_t ltime;
time(&ltime);
return ctime(&ltime);
}
文件 example.i
/
example.i /
%module example
%{
/
Put header files here or function declarations like below */
extern double My_variable;
extern int fact(int n);
extern int my_mod(int x, int y);
extern char *get_time();
%}

extern double My_variable;
extern int fact(int n);
extern int my_mod(int x, int y);
extern char *get_time();

main.java代码
public class main {
public static void main(String argv[]) {
System.loadLibrary("example");
System.out.println(example.getMy_variable());
System.out.println(example.fact(5));
System.out.println(example.get_time());
}
}
保存好三个文件:
图片说明
执行:swig -java example.i
图片说明
查找一下jni所需头文件的位置。(JNI = Java Native Interface,需要安装jdk): locate jni.h
或者直接找到jdk的include目录:
图片说明
把c代码编译成动态链接库(把前面找出来的jni头文件路径替换掉下面的参数相应部分)。
注意:动态链接库的文件名称格式为 lib*.so。
1:gcc -fpic –c example.c example_wrap.c -I/usr/java/jdk1.8.0/include/ -I/usr/java/jdk1.8.0/include/linux/
2:gcc -shared example.o example_wrap.o -o libexample.so
图片说明
编译调用C函数的java代码为class:
javac main.java
执行java程序:java main
图片说明
出现报错:第一种解决方法:java命令参数指定。
java -Djava.library.path=. main
第二种解决方法:导出环境变量LD_LIBRARY_PATH。
export LD_LIBRARY_PATH=.
图片说明

官方站点 http://www.swig.org/

By:林初七 2019.7.23