Swig编译C代码供java调用实例
2015-06-09 17:17
483 查看
SWIG是Simplified Wrapper and Interface Generator的缩写,其官方站点是http://www.swig.org/。SWIG是个帮助使用C或者C++编写的软件能与其它各种高级编程语言进行嵌入联接的开发工具。SWIG能应用于各种不同类型的语言包括常用脚本编译语言例如Perl, PHP, Python, Tcl, Ruby and PHP。支持语言列表中也包括非脚本编译语言,例如C#, Common Lisp
(CLISP, Allegro CL, CFFI, UFFI), Java, Modula-3, OCAML以及R,甚至是编译器或者汇编的计划应用(Guile, MzScheme, Chicken)。SWIG普遍应用于创建高级语言解析或汇编程序环境,用户接口,作为一种用来测试C/C++或进行原型设计的工具。SWIG还能够导出 XML或Lisp s-expressions格式的解析树。SWIG可以被自由使用,发布,修改用于商业或非商业中。
下面介绍一个实例实现c代码编译出.so库 并供java调用
第一步:安装swig,我的环境是ubuntu,有两种安装方式:
(1)sudo apt-get install swig; 如果不能下载可能是源有问题,要更新源
(2)源码安装,http://www.swig.org/download.html 在此处下载源码,我下载的版本是swig-3.0.5
安装流程:tar -xzvf swig-2.0.11.tar.gz
./configure --prefix=/home/mark/developer/swigtool // 指定安装目录
make // 编译
make install // 安装
(3)至此安装应该没问题,进入swig的安装目录下的bin文件夹执行 ./swig -version 检验swig安装是否成功,如果出现相关版本信息则安装成功。
第二步:写一段C代码:
第三步:写接口文件
第四步:写java代码
第五步:编译:
命令如下:
swig -java example.i;//注意如果swig没有添加至path中,此命令要在swig执行目录下进行 ./swig -java /example.i所在地址/
locate jni.h 查找一下jni所需头文件的位置。 记住返回的结果,在编译是有用。
locate jni_md.h 同上;
gcc -fpic -c example.c example_wrap.c -I/usr/java/jdk1.6.0_21/include/ -I/usr/java/jdk1.6.0_21/include/linux/ 两个路径分别为前两个命令返回的路径
javac main.java 生成 .class文件
java -Djava.library.path=. main 指定运行参数
java main 执行 我的结果为:
3.0
120
Tue Jun 9 17:17:55 2015 为系统时间。
(CLISP, Allegro CL, CFFI, UFFI), Java, Modula-3, OCAML以及R,甚至是编译器或者汇编的计划应用(Guile, MzScheme, Chicken)。SWIG普遍应用于创建高级语言解析或汇编程序环境,用户接口,作为一种用来测试C/C++或进行原型设计的工具。SWIG还能够导出 XML或Lisp s-expressions格式的解析树。SWIG可以被自由使用,发布,修改用于商业或非商业中。
下面介绍一个实例实现c代码编译出.so库 并供java调用
第一步:安装swig,我的环境是ubuntu,有两种安装方式:
(1)sudo apt-get install swig; 如果不能下载可能是源有问题,要更新源
(2)源码安装,http://www.swig.org/download.html 在此处下载源码,我下载的版本是swig-3.0.5
安装流程:tar -xzvf swig-2.0.11.tar.gz
./configure --prefix=/home/mark/developer/swigtool // 指定安装目录
make // 编译
make install // 安装
(3)至此安装应该没问题,进入swig的安装目录下的bin文件夹执行 ./swig -version 检验swig安装是否成功,如果出现相关版本信息则安装成功。
第二步:写一段C代码:
<span style="font-size:14px;">/* File : example.c */ #include <time.h> 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(<ime); return ctime(<ime); }</span>
第三步:写接口文件
<span style="font-size:14px;"> /* 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(); </span>
第四步:写java代码
<span style="font-size:14px;">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()); } } </span>
第五步:编译:
命令如下:
swig -java example.i;//注意如果swig没有添加至path中,此命令要在swig执行目录下进行 ./swig -java /example.i所在地址/
locate jni.h 查找一下jni所需头文件的位置。 记住返回的结果,在编译是有用。
locate jni_md.h 同上;
gcc -fpic -c example.c example_wrap.c -I/usr/java/jdk1.6.0_21/include/ -I/usr/java/jdk1.6.0_21/include/linux/ 两个路径分别为前两个命令返回的路径
javac main.java 生成 .class文件
java -Djava.library.path=. main 指定运行参数
java main 执行 我的结果为:
3.0
120
Tue Jun 9 17:17:55 2015 为系统时间。
相关文章推荐
- Linux C函数参考手册(PDF版)
- Lua教程(十七):C API简介
- 编程界主流脚本编程语言的比较和选择
- 什么是Perl?编程语言Perl详细介绍
- C#实现打造气泡屏幕保护效果
- 编程语言里的静态、动态、强类型、弱类型等概念介绍
- C/C++数据对齐详细解析
- C 语言基础教程(我的C之旅开始了)[三]
- C++中的extern “C”用法详解
- C 语言基础教程(我的C之旅开始了)[七]
- C字符串操作函数实现方法小结
- C/C++ 宏详细解析
- 编程趣事:当下流行编程语言的”讨厌”程度排行榜
- C/C++实现对STORM运行信息查看及控制的方法
- 用C#生成不重复的随机数的代码
- 在c和c++中实现函数回调
- 浅析C/C++中被人误解的SIZEOF
- C 语言基础教程(我的C之旅开始了)[六]
- 程序员必看2008编程语言走势解盘