Swig编译C代码供java调用实例

来源:互联网 发布:php 执行git命令 编辑:程序博客网 时间:2024/06/06 03:40

  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代码:

<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  为系统时间。


  




0 0
原创粉丝点击