- 浏览: 4760462 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
bzhao:
你也应该可以这样:(not tested)./rbtunnel ...
在Bash脚本中怎么关闭文件描述符? -
bzhao:
如果有A进程原代码情况下,通过如下调用,把他的子进程继承关闭则 ...
在Bash脚本中怎么关闭文件描述符? -
Master-Gao:
楼主咋没分析下源码呢?
我使用过的Linux命令之dirname - 截取给定路径的目录部分 -
jiedushi:
tail -F 就可以吧
Linux下实时跟踪log4j日志文件的bash脚本 - 增强了tail -f的功能 -
java_is_new:
新手学习了,就是不明白为一个网卡配多个ip有什么用
我使用过的Linux命令之ifconfig - 网络配置命令
我使用过的Linux命令之swig - 把C/C++的代码嵌入Java等语言的开发工具
本文链接:http://codingstandards.iteye.com/blog/830342 (转载请注明链接)
用途说明
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可以被自由使用,发布,修改用于商业或非商业中。
常用参数
swig -version 看SWIG开发工具的版本。
swig -java 生成java代码。见示例三所展示的。
swig -help 看帮助。用 man swig 和 info swig 没有看到相应的手册。
最佳的学习swig的方法就是到官方网站去看相关文档。
使用示例
示例一 查看swig的基本信息
注:有些Linux安装之后不一定有swig命令,可以先确认一下是否安装了swig,以及是哪种安装方式(rpm方式,make方式)。RHEL5.5下默认安装的swig版本是1.3.29,当前最新版本是Version: 2.0.1 (4 October 2010)。可以先把Linux默认安装的版本删除,然后再下载源代码编译安装。
[root@new55 swig]# rpm -q swig
swig-1.3.29-2.el5
[root@new55 swig]# swig -version
SWIG Version 1.3.29
Compiled with g++ [i686-redhat-linux-gnu]
Please see http://www.swig.org for reporting bugs and further information
[root@new55 swig]# whereis swig
swig: /usr/bin/swig /usr/share/swig
[root@new55 swig]# which swig
/usr/bin/swig
[root@new55 swig]# rpm -qif $(which swig)
Name : swig Relocations: (not relocatable)
Version : 1.3.29 Vendor: Red Hat, Inc.
Release : 2.el5 Build Date: 2006年11月07日 星期二 16时15分56秒
Install Date: 2010年08月13日 星期五 00时19分22秒 Build Host: hs20-bc2-4.build.redhat.com
Group : Development/Tools Source RPM: swig-1.3.29-2.el5.src.rpm
Size : 8572427 License: BSD
Signature : DSA/SHA1, 2007年01月18日 星期四 01时53分06秒, Key ID 5326810137017186
Packager : Red Hat, Inc. <http://bugzilla.redhat.com/bugzilla>
URL : http://swig.sourceforge.net/
Summary : 把 C/C++/Objective C 连接到某些高级别的编程语言。
Description :
Simplified Wrapper and Interface Generator (SWIG) is a software
development tool for connecting C, C++ and Objective C programs with a
variety of high-level programming languages. SWIG is primarily used
with Perl, Python and Tcl/TK, but it has also been extended to Java,
Eiffel and Guile. SWIG is normally used to create high-level
interpreted programming environments, systems integration, and as a
tool for building user interfaces.
[root@new55 swig]#
示例二 下载、编译和安装swig开发工具
下载最新的swig包 。
[root@new55 setup]# wget "http://sourceforge.net/projects/swig/files/swig/swig-2.0.1/swig-2.0.1.tar.gz/download"
--2010-12-01 11:17:44-- http://sourceforge.net/projects/swig/files/swig/swig-2.0.1/swig-2.0.1.tar.gz/download
正在解析主机 sourceforge.net... 216.34.181.60
Connecting to sourceforge.net|216.34.181.60|:80... 已连接。
已发出 HTTP 请求,正在等待回应... 302 Found
位置:http://downloads.sourceforge.net/project/swig/swig/swig-2.0.1/swig-2.0.1.tar.gz?r=&ts=1291173453&use_mirror=ncu [跟随至新的 URL]
--2010-12-01 11:17:45-- http://downloads.sourceforge.net/project/swig/swig/swig-2.0.1/swig-2.0.1.tar.gz?r=&ts=1291173453&use_mirror=ncu
正在解析主机 downloads.sourceforge.net... 216.34.181.59
Connecting to downloads.sourceforge.net|216.34.181.59|:80... 已连接。
已发出 HTTP 请求,正在等待回应... 302 Found
位置:http://ncu.dl.sourceforge.net/project/swig/swig/swig-2.0.1/swig-2.0.1.tar.gz [跟随至新的 URL]
--2010-12-01 11:17:46-- http://ncu.dl.sourceforge.net/project/swig/swig/swig-2.0.1/swig-2.0.1.tar.gz
正在解析主机 ncu.dl.sourceforge.net... 140.115.17.45
Connecting to ncu.dl.sourceforge.net|140.115.17.45|:80... 已连接。
已发出 HTTP 请求,正在等待回应... 200 OK
长度:4922992 (4.7M) [application/x-gzip]
Saving to: `swig-2.0.1.tar.gz'
100%[==========================================================================================>] 4,922,992 10.4K/s in 9m 10s
2010-12-01 11:26:57 (8.73 KB/s) - `swig-2.0.1.tar.gz' saved [4922992/4922992]
[root@new55 setup]# ls -l swig-2.0.1.tar.gz
-rw-r--r-- 1 root root 4922992 10-05 04:48 swig-2.0.1.tar.gz
[root@new55 setup]#
将系统原有的swig软件卸载掉。
[root@new55 setup]# rpm -q swig
swig-1.3.29-2.el5
[root@new55 setup]# rpm -e swig-1.3.29-2.el5
[root@new55 setup]#
解压,编译,安装。
[root@new55 setup]# tar zxf swig-2.0.1.tar.gz
[root@new55 setup]# cd swig-2.0.1/
[root@new55 swig-2.0.1]# ls
aclocal.m4 CCache configure Doc Lib LICENSE-UNIVERSITIES README swig.spec.in vms
ANNOUNCE CHANGES configure.in Examples LICENSE Makefile.in RELEASENOTES TODO Win
autogen.sh CHANGES.current COPYRIGHT INSTALL LICENSE-GPL preinst-swig.in Source Tools
[root@new55 swig-2.0.1]# ./configure --prefix=/usr
checking build system type... i686-pc-linux-gnu
checking host system type... i686-pc-linux-gnu
省略输出
checking whether to enable PCRE support... yes
checking whether to use local PCRE... no
checking for a sed that does not truncate output... /bin/sed
checking for pcre-config... no
configure: error:
Can't find pcre-config script from PCRE (Perl Compatible Regular Expressions)
library package. This dependency is needed for configure to complete,
Either:
- Install the PCRE developer package on your system (preferred approach).
- Download the PCRE source tarball, build and install on your system
as you would for any package built from source distribution.
- Use the Tools/pcre-build.sh script to build PCRE just for SWIG to statically
link against. Run 'Tools/pcre-build.sh --help' for instructions.
(quite easy and does not require privileges to install PCRE on your system)
- Use configure --without-pcre to disable regular expressions support in SWIG
(not recommended).
See `config.log' for more details.
[root@new55 swig-2.0.1]#
configure报错了,缺少pcre开发包。(PCRE = Perl Compatible Regular Expressions)
到Linux安装盘中找pcre开发包,我的机器上安装盘保存到镜像文件rhel55.iso了。
[root@new55 os]# mkdir /mnt/rhel55
[root@new55 os]# mount rhel55.iso /mnt/rhel55
mount: rhel55.iso is not a block device (maybe try `-o loop'?)
[root@new55 os]# mount -o loop rhel55.iso /mnt/rhel55
[root@new55 os]# cd /mnt/rhel55/
[root@new55 rhel55]# find . -name "pcre*rpm"
./Server/pcre-6.6-2.el5_1.7.i386.rpm
./Server/pcre-devel-6.6-2.el5_1.7.i386.rpm
[root@new55 rhel55]# rpm -ivh ./Server/pcre-devel-6.6-2.el5_1.7.i386.rpm
warning: ./Server/pcre-devel-6.6-2.el5_1.7.i386.rpm: Header V3 DSA signature: NOKEY, key ID 37017186
Preparing... ########################################### [100%]
1:pcre-devel ########################################### [100%]
[root@new55 rhel55]#
重新configure。
[root@new55 swig-2.0.1]# ./configure --prefix=/usr
checking build system type... i686-pc-linux-gnu
省略输出
configure: creating ./config.status
config.status: creating Makefile
config.status: creating config.h
[root@new55 swig-2.0.1]#
编译,安装。
[root@new55 swig-2.0.1]# make
make[1]: Entering directory `/root/setup/swig-2.0.1/Source'
make all-am
make[2]: Entering directory `/root/setup/swig-2.0.1/Source'
make[1]: Leaving directory `/root/setup/swig-2.0.1/CCache'
[root@new55 swig-2.0.1]# make install
Installing SWIG executable
Installing /usr/bin/swig
Installing the SWIG library
省略输出
Installing ccache-swig
Installing /usr/bin/ccache-swig
Installing /usr/share/man/man1/ccache-swig.1
Installation complete
[root@new55 swig-2.0.1]#
确认是否安装成功,查看一下版本号。
[root@new55 swig-2.0.1]# swig -version
SWIG Version 2.0.1
Compiled with g++ [i686-pc-linux-gnu]
Configured options: +pcre
Please see http://www.swig.org for reporting bugs and further information
[root@new55 swig-2.0.1]#
示例三 把官方站点的提供的例子在Linux下用Java尝试一下
文件 example.c
/* 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); }
文件 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()); } }
先在Linux下将上面三个文件保存好。
[root@new55 swig]# swig -java example.i
[root@new55 swig]# ls
example.c example.i example.java exampleJNI.java example_wrap.c main.java
查找一下jni所需头文件的位置。(JNI = Java Native Interface)
[root@new55 swig]# locate jni.h
/usr/include/xulrunner-sdk-1.9/java/jni.h
/usr/include/xulrunner-sdk-1.9/stable/jni.h
/usr/include/xulrunner-sdk-1.9/system_wrappers/jni.h
/usr/include/xulrunner-sdk-1.9/system_wrappers/JavaVM/jni.h
/usr/java/jdk1.6.0_21/include
/
jni.h
[root@new55 swig]# locate jni_md.h
/usr/include/xulrunner-sdk-1.9/java/jni_md.h
/usr/include/xulrunner-sdk-1.9/stable/jni_md.h
/usr/java/jdk1.6.0_21/include/linux/
jni_md.h
把c代码编译成动态链接库(把前面找出来的jni头文件路径替换掉下面的参数相应部分)。
注意:动态链接库的文件名称格式为 lib*.so。
[root@new55 swig]# 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/
[root@new55 swig]# gcc -shared example.o example_wrap.o -o libexample.so
编译调用C函数的java代码为class。
[root@new55 swig]# javac main.java
执行java程序。
[root@new55 swig]# java main
Exception in thread "main" java.lang.UnsatisfiedLinkError: no example in java.library.path
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1734)
at java.lang.Runtime.loadLibrary0(Runtime.java:823)
at java.lang.System.loadLibrary(System.java:1028)
at main.main(main.java:3)
上面的报错有两种解决方法。
第一种方法:java命令参数指定。
[root@new55 swig]# java -Djava.library.path=. main
3.0
120
Wed Dec 1 11:04:03 2010
[root@new55 swig]# java main
3.0
120
Tue Nov 30 19:41:37 2010
第二种方法:导出环境变量LD_LIBRARY_PATH。
[root@new55 swig]# export LD_LIBRARY_PATH=.
[root@new55 swig]# java main
3.0
120
Wed Dec 1 11:04:44 2010
[root@new55 swig]#
到此,在java中使用C代码的尝试就成功了。
问题思考
相关资料
【1】官方站点 http://www.swig.org/
【2】SWIG是什么 http://www.swig.org/translations/chinese/exec.html
【3】Swig Tutorial http://swig.minidx.com/tutorial.html
【4】SWIG and JAVA http://www.swig.org/Doc1.3/Java.html
【5】SwigFaqLinuxSharedLibraries http://www.dabeaz.com/cgi-bin/wiki.pl?SwigFaqLinuxSharedLibraries
【6】百度百科 SWIG
【7】花钱的年华 SWIG,C/C++类库与Java,Python等泛高阶语言的万能粘合剂
【8】masrpsj 利用SWIG转换C++接口到Java接口
发表评论
-
在Linux用tar归档压缩文件时忽略某些文件和目录
2013-02-01 10:19 17076在Linux下,常用tar对文 ... -
使用nmap扫描服务器端口的一次操作
2012-11-01 17:00 15166使用nmap扫描服务器端口的一次操作 本文来自:http ... -
我使用过的Linux命令之wget - ooo
2011-09-14 13:10 0我使用过的Linux命令之wg ... -
推荐一篇学习Vim使用的好文:酷壳 - 简明 Vim 练级攻略
2011-09-09 12:53 9167简明 Vim 练级攻略 http://coolshell.c ... -
推荐一篇学习Vim使用的好文:酷壳 - 简明 Vim 练级攻略
2011-09-09 12:49 1简明 Vim 练级攻略 http://coolshell.c ... -
我使用过的Linux命令之:(冒号) - 啥也不做(除了……)
2011-08-29 13:18 12121我使用过的Linux命令之: ... -
我使用过的Linux命令之date - 显示、修改系统日期时间
2011-08-25 09:21 42020我使用过的Linux命令之da ... -
我使用过的Linux命令之declare - 声明shell变量(不知道没关系、知道了就更好的内建命令)
2011-08-16 09:22 21887我使用过的Linux命令之declare - 声明shell变 ... -
我使用过的Linux命令之alias - 设置命令的别名,让 Linux 命令更简练
2011-08-11 09:31 28850我使用过的Linux命令之alias - 设置命令的别名,让 ... -
我使用过的Linux命令之ar - 创建静态库.a文件
2011-08-08 10:40 51959我使用过的Linux命令之ar - 创建静态库.a文件 本 ... -
我使用过的Linux命令之crontab - 设置例行任务(类似于Windows中的任务计划)
2011-08-04 22:26 9769我使用过的Linux命令之crontab - 设置例行任务(类 ... -
我使用过的Linux命令之chmod - 改变文件/目录的访问权限
2011-08-03 21:33 10724我使用过的Linux命令之chmod - 改变文件/目录的访问 ... -
我使用过的Linux命令之export - 设置或显示环境变量
2011-08-02 19:55 25478我使用过的Linux命令之export - 设置或显示环境变量 ... -
我使用过的Linux命令之wc - 统计文件行数、单词数或字节数
2011-07-26 10:50 29054我使用过的Linux命令之wc - 统计文件行数、单词数或字节 ... -
我使用过的Linux命令之groupdel - 删除群组
2011-07-22 22:13 9718我使用过的Linux命令之gr ... -
我使用过的Linux命令之ifconfig - 网络配置命令
2011-07-21 20:43 60599我使用过的Linux命令之ifconfig - 网络配置命令 ... -
我使用过的Linux命令之ll - 列出文件/目录的详细信息
2011-07-20 21:22 7264我使用过的Linux命令之ll ... -
我使用过的Linux命令之mkdir - 创建目录
2011-07-20 20:58 13709我使用过的Linux命令之mkdir - 创建目录 本文链 ... -
我使用过的Linux命令之perror - 解释错误代码
2011-07-18 20:29 25128我使用过的Linux命令之perror - 解释错误代码 ... -
我使用过的Linux命令之ping - 测试与目标主机的连通性
2011-07-16 10:46 26672我使用过的Linux命令之ping - 测试与目标主机的连通性 ...
相关推荐
SWIG的主要功能是生成一个 wrapper(封装器),将C/C++代码暴露给脚本语言,以便在脚本语言中使用C/C++代码。 SWIG的优点 * 跨语言调用:SWIG使得C/C++代码可以在脚本语言中被调用,实现了跨语言的调用。 * 高效率...
通过使用 SWIG (Simplified Wrapper and Interface Generator) 等工具,可以在保持 Python 的灵活性、生产力和易于维护的同时,利用 C 或 C++ 的高性能部分。这种方法使得 Python 程序员可以在需要的地方调用 C 或 ...
SWIG(Simplified Wrapper and Interface Generator)是一款强大的工具,用于将C和C++代码自动封装成其他编程语言的接口,如Python、Java、Perl、PHP等。`swig-4.0.1.tar.gz`是一个包含SWIG 4.0.1版本源代码的压缩包...
标题中的“swig”是指Software Interface Generator,它是一个开源工具,用于将C和C++代码与多种编程语言(如Java和C#)互操作。在本案例中,我们将探讨如何利用SWIG在Java和C#中调用由C++编写的动态链接库(DLL)。VS...
配置环境变量JAVA_BIN和JAVA_INCLUDE。比如: ...工程“属性” -> C/C++ -> 常规 -> 调试信息格式,选择“程序数据库(/Zi)”。 “生成”64位版本。 打开win10控制台,进入simple,运行”java runme“。
SWIG是个帮助使用C或者C++编写的软件能与其它各种高级编程语言进行嵌入联接的开发工具。SWIG能应用于各种不同类型的语言包括常用脚本编译语言例如Perl, PHP, Python, Tcl, Ruby and PHP。支持语言列表中也包括非脚本...
总的来说,SWIG是一个强大的工具,能够帮助开发者快速地将C/C++代码集成到各种脚本语言中,提高了开发效率和代码的可复用性。无论是Linux还是Windows用户,都可以利用这两个压缩包轻松获取和使用SWIG。
Swig(Simplified Wrapper and Interface Generator)是一种工具,它能够自动将C++库转换为其他编程语言,如C#,从而让这些语言可以调用C++的函数和类。在这个"使用Swig转换C++库到C#示例代码"的压缩包中,我们有三...
SWIG(Simplified Wrapper and Interface Generator)是一款强大的工具,用于将C和C++代码与多种高级语言(如Python、Perl、Java、Ruby等)连接起来。`swig-2.0.10.tar.gz` 是SWIG的一个版本,具体是2.0.10版的源码...
在描述中提到的"java等与c、c++的粘合代码生成工具",指的是SWIG可以生成Java绑定,让Java程序员能够直接调用C/C++库,而无需手动编写复杂的JNI(Java Native Interface)代码。这极大地简化了跨语言编程,提高了...
对开发人员的一个常见要求是向脚本语言接口公开 C/C++ 代码,这正是 Simplified Wrapper and Interface Generator (SWIG) 的用武之地。SWIG 允许您向广泛的脚本语言公开 C/C++ 代码,包括 Ruby、Perl、Tcl 和 Python...
SWIG(Simplified Wrapper and Interface Generator)是一款强大的工具,用于自动构建接口,使得C和C++的库可以被多种高级脚本语言如Python、Perl、Java等调用。在这个"swig-4.0.2-windows版本安装包"中,我们有两个...
SWIG(Simplified Wrapper and Interface Generator)是一款强大的工具,用于将C和C++代码自动封装成其他编程语言的接口,比如Python、Java、Perl、PHP等。在Windows平台上,SWIG通常以预编译的二进制形式提供,如本...
总的来说,SWIG 2.0.9是C/C++库与Python、Lua等语言交互的强大工具,通过自动化接口生成,降低了多语言编程的复杂性,提升了开发效率。对于需要跨语言交互的开发者来说,这是一个非常有价值的资源。
SWIG(Simplified Wrapper and Interface Generator)是一款强大的工具,用于将C和C++代码与多种高级语言(如Python、Perl、Java、Ruby等)接口。在这个案例中,我们讨论的是SWIG的2.0.12版本,它是一个用于安装...
SWIG(Simplified Wrapper and Interface Generator)是一款强大的工具,用于将C和C++代码自动绑定到多种脚本语言,如Python、Perl、Tcl、Java、Ruby等。它简化了创建这些语言的接口过程,使得C/C++库可以方便地在...
SWIG是一个强大的工具,主要用于创建程序接口,它可以将C和C++代码与多种高级语言如Python、Perl、Java、Ruby、Tcl、PHP、JavaScript等相连接。它的主要用途是简化创建这些脚本语言的绑定,使得C或C++库可以轻松地在...
包括SWIG的版本介绍、许可证信息、安装方法、目标语言支持情况、实际使用SWIG的例子、如何创建SWIG接口文件、SWIG命令的使用、如何构建Perl、Python等语言模块、SWIG支持的C/C++语言特性、非侵入式接口构建、将SWIG...
GO语言集成C与C++代码的能力为开发者提供了一种高效的方法来利用现有的C/C++库,从而加速项目的开发进程。通过这种方式,可以有效地融合两种不同语言的优势,即Go语言的简洁性、易用性和性能优势,以及C/C++在系统...
SWIG-4.2.0是SWIG的一个版本,提供了对最新C++标准的支持和优化,使得C++程序可以方便地被Python等脚本语言调用,极大地扩展了C++库的使用范围。 ### SWIG基本概念 1. **接口文件(.i 文件)**:SWIG工作时需要一...