您的位置:首页 > 编程语言 > Java开发

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

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

  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息