2013韩国电影推荐:SWIG入门实例

来源:百度文库 编辑:中财网 时间:2024/04/28 16:47:38
第一次使用swig,通过swig官网上的例子进行了一次实验。

官网使用教程:http://www.swig.org/translations/chinese/tutorial.html

此次实验主要是在ubuntu下实现java接口,使java可以调用c实现的函数。
首先安装swig,在终端上输入:sudo apt-get install swig
下面开始本次实验:

1.在/home/lance/practice/swig下新建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(<ime);
return ctime(<ime);
}

2.编写接口文件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();
3.通过终端建立java模块:
首先进入example.i的目录下,cd /home/lance/practice/swig
然后在终端输入:swig -java example
会生成以下几个文件:
example.java   
example_wrap.c
exampleJNI.java

之后编译.c文件:gcc -c example.c example_wrap.c -I /usr/lib/jvm/java-6-sun/include/ -I /usr/lib/jvm/java-6-sun/include/linux/
其中:/usr/lib/jvm/java-6-sun/include/是jni.h的路径, /usr/lib/jvm/java-6-sun/include/linux/是jni_mb.h的路径
会生成以下两个.o文件:
example.o      
example_wrap.o

最后生成共享库:gcc -shared example.o example_wrap.o -o libexample.so
这样在目录下就会生成 libexample.so。当然为了保证后java端能加载这个共享库,应该将.so文件放在/lib或者/usr/lib下,或者以面的代码中加入目标路径:sudo gcc -shared example.o example_wrap.o -o /lib/libexample.so,这样就直接将共享库生成在/lib下了。

 
4.编写java运用程序
到这儿已经将动态库(共享库)生成了,接下来的工作就是写java运用程序了。
编写main.java文件:
public class main {

   public static void main(String argv[]) {
   
     System.loadLibrary("example");
//     System.load("/home/lance/practice/swig/libexample.so");
     System.out.println(example.getMy_variable());
     System.out.println(example.fact(5));
     System.out.println(example.get_time());

   }
 }
说明:

加载动态库的方法:
第一种:
1.System.loadLibrary("name"),loadLibrary function must not include the file extension name in the string, that is .dll or .so,相应的动态库名为libname.so
2.可以通过System.out.println(System.getProperty("java.library.path")); 可以找到库路径。
3.libname.so 应放在库路径下
第二种:
用System.load("本地库路径/libname.so")
如此例:
System.load("/home/lance/practice/swig/libexample.so");

之后编译,java:javac main.java
再运行:java main
终端将会输出以下信息:
3.0
120
Wed Nov 23 17:16:39 2011

这样此次实验就完成了!