我使用过的Linux命令之swig - 把C/C++的代码嵌入Java等语言的开发工具

我使用过的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(&ltime);
     return ctime(&ltime);
 }

 

文件 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命令系列总目录

 

swig3-doc-3.0.12-17.el7.noarch.rpm 官方离线安装包,亲测可用。使用rpm -ivh [rpm完整包名] 进行安装 立即下载

相关推荐

swig-4.0.2-windows版本安装包

swig-4.0.2-windows版本安装包

linux学习笔记——swig

参考链接:linux 安装swig下载地址:https://sourceforge.net/projects/swig/files/swig/tar xvf swig-4.0.2.tar.gzcd swig-4.0.2./configuremakesudo make install输入:swig -version 查看是否安装成功错误: ./configure时出现错误 Cannot find pcre-config script from PCRE (Perl Compatible Regular Exp

phily123的博客 1494

LAMMPS+Phonopy计算声子色散曲线

机器学习训练完势函数之后,需要对加以验证。对于晶体而言,色散曲线是其衡量计算是否准确的最重要标准,当然,还有能量,比热,RDF等性质。

qq_68842798的博客 3462

swig linux

SWIG是一种软件开发工具

阳光8088的专栏 1756

统信UOS系统网络服务异常排查:WIFI图标消失与网络设置缺失的解决方案

本文详细解析了统信UOS系统WIFI图标消失与网络设置缺失的常见问题,提供了从基础修复到进阶排查的完整解决方案。重点分析了NetworkManager服务异常的根本原因,包括系统更新中断、权限配置错误等,并给出实用的命令行操作指南和预防措施,帮助用户快速恢复网络功能。

weixin_29234239的博客 616

华中农业大学C++考试基础练习题

实验一 1 通过日期求某月的天数。 输入日期的年份和月份,求该月有多少天。提示:对于月份为1、3、5、7、8、10、12的月份天数为31,月份为4、6、9、11的月份天数为30,月份为2时要结合年份考虑闰年的情况。 输入描述 输入两个正整数y和m分别表示年份和月份。 输出描述 如果y和m满足条件:1900<=y<3000,0<m<13,输出该月的天数;否则输出“Input error!”。 输入样例 2010 12 输出样例 31 #include"iostream" using n

雨的博客 1万+

linux+swig+python,linux下使用swig让python调用C++(复杂版:包括多文件调用和链接库)...

第一次用swig,网上找了各种资料,比如http://www.cnblogs.com/kaituorensheng/p/4464117.html入门可以看上面这个链接但要么过于简单要么过于复杂我的需求是,现在有一个C++工程,包括多个.cpp和.h文件,并且使用了外部的.a .so库使用python来调用。假设python需要调用的C++类及其定义都在头文件hello.h中。首先C++程序自己要能...

weixin_29144939的博客 380

【nnUNetv2进阶】四、nnUNetv2 魔改网络-小试牛刀-加入注意力机制ChannelAttention

本文介绍了在nnunet中加入ChannelAttention的方法,按照本文教的教程,可以快速完成ChannelAttention的加入和自定义模型的跑通。

AI爱好者的博客,分享计算机领域相关知识 5800

swig java c_我使用过的Linux命令之swig - 把C/C++的代码嵌入Java等语言的开发工具

用途说明SWIG是Simplified Wrapper and Interface Generator的缩写,其官方站点是http://www.swig.org/。SWIG是个帮助使用C或者C++编写的软件能与其它各种高级编程语言进行嵌入联接的开发工具。SWIG能应用于各种不同类型的语言包括常用脚本编译语言例如Perl, PHP, Python, Tcl, Ruby and PHP。支持语言列表中...

weixin_34460380的博客 394

自动化测试与AI的结合应用

自动化测试,人工智能,机器学习,深度学习,测试用例生成,缺陷预测,测试优化 1. 背景介绍 在软件开发领域,自动化测试已成为不可或缺的一部分,它可以提高测试效率、降低测试成本,并确保软件质量。然而,传统的自动化测试方法往往依赖于人工编写的测试用例,这不仅耗时费力,而且难以应对复杂软件

AI架构师小马 2246

10、利用智能合约实现公平的私有集合交集

本文探讨了利用智能合约实现公平的私有集合交集(PSI)的多种协议,重点分析了协议 Π 和 Π∗ 的气体成本与性能特点。同时对比了包括 Justitia 和 Anesidora 在内的现有方案,突出了仅使用智能合约实现硬币补偿公平性的优势。文中还介绍了相关密码学基础、安全模型及隐私保障机制,为在不同应用场景下选择高效、安全的 PSI 协议提供了理论支持和实践指导。

linux的博客 95

一天一条Linux指令-swig

用途说明   SWIG是Simplified Wrapper and Interface Generator的缩写,其官方站点是http://www.swig.org/。SWIG是个帮助使用C或者C++编写的软件能与其它各种高级编程语言进行嵌入联接的开发工具。SWIG能应用于各种不同类型的语言包括常用脚本编译语言例如Perl, PHP, Python, Tcl, Ruby and PHP。支

u012313689的博客 2997

第八节:Orin NX 修改pinmux

读SPI1对应的寄存器,看对应的GPIO口是否被复用为SPI功能。说明GPIO口的功能已经被复用为SPI。烧录或者命令行烧录,都是根据。这里我们把文件统一命名成。文件,Orin NX的。测试SPI功能,基于。

孤独旅客的博客 792

swig入门

最近发现有些漏洞不能扫描,原来是没有需要的库,这些库原来是用SWIG生成的一些接口程序,于是顺便小研究了下这个SWIG是怎么回事。 下面是摘于SWIG中文网:http://swig.minidx.com/ SWIG是个帮助使用C或者C++编写的软件能与其它各种高级编程语言进行嵌入联接的开发工具。SWIG能应用于各种不同类型的语言包括常用脚本编译语言例如Perl, PHP, Python

ShaderJoy 的兴趣技术杂货铺 8824

【微信小程序】微信小程序开发环境搭建:安装微信小程序开发者工具

通过本文的介绍,你应该已经成功安装并配置了微信小程序开发者工具,为微信小程序开发做好了准备。接下来,你可以开始编写你的第一个小程序项目,探索更多有趣的功能和特性。祝你开发顺利,创造更多优秀的作品!

墨夶的博客 2948

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Linux系统 C/C++编程基础——基于GTK+的图形用户界面编程

本文主要介绍GTK+是一套跨多种平台的开放源码图形用户界面工具包。GTK+类似于Windows上的MFC和Win32 API、JAVA上的Swing和SWT,是Linux下开发GUI应用程序的主流开发工具之一。GTK+可以用来进行跨平台GUI应用程序的开发。GlibPango和ATKGNOME桌面环境以GTK+为基础,为GNOME编写的程序使用GTK+作为其工具箱。Glade 是一个用于创建和编辑 GTK+ 和 GNOME 应用程序用户界面的开源可视化设计工具。

weixin_55767624的博客 2785

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

使用SWIG将CRF++封装成JNI接口

说明 本文既不是SWIG的介绍,也不是CRF++的说明,只是记录一下如何将CRF++通过SWIG封装出JNI接口以供Java调用。 其实Java通过Runtime直接调用CRF++的系统命令也是可以的,但那样比较麻烦,在我们项目中,分好的词是存储在Java对象(也就是内存)中的,如果以系统命令形式使用CRF++的话,需要将内容写到文本中以参数形式传递给CRF++的系统命令,然后再分析CRF++

竹叶青的专栏 6445

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

linux java gdal_linux下gdal的搭建

[源码编译]前期准备:确认电脑上安装好g++等开发环境,否则执行sudo apt-get install build-essential2. 确认电脑上已经安装好svn以便下载最新的源代码,否则执行sudo apt-get install subversion3. 确保proj4的安装$ curl -O http://download.osgeo.org/proj/proj-4.8.0.tar...

weixin_32146783的博客 773

嵌入式系统中Python调用C模块的3种方式(性能优化终极指南)

掌握嵌入式系统中C与Python的协作模式,提升系统性能与开发效率。本文详解Python调用C模块的3种方式,涵盖 ctypes、SWIG 与 C 扩展,适用于资源受限环境下的高性能计算场景,实现无缝集成与效率跃升,值得收藏。

FuncWander的博客 946

【Linux】Ubuntu Linux 操作系统 ——Java开发环境

本文主要介绍在Linux系统中安装,配置并使用Java的相关知识点,以及在Ubuntu上安装Eclipse软件,JDK等知识!!!感谢支持!!

weixin_55767624的博客 1653

C++跨语言调用实战:从原理到性能优化

跨语言调用是混合编程中的关键技术,它使不同编程语言能够相互调用功能模块。其核心原理是通过定义统一的二进制接口(ABI),在内存布局和调用约定层面建立桥梁。在工程实践中,C++常作为高性能模块的实现语言,而Python等脚本语言则负责业务逻辑。通过extern C、SWIG或pybind11等技术,可以实现C++与Python/Java等语言的高效互操作。这种技术在计算机视觉、高频交易等性能敏感场景中尤为重要,例如使用Python调用C++优化的OpenCV模块,或将C++数学库集成到Java应用中。现代方案

weixin_30252709的博客 466
上一篇: 我使用过的Linux命令之sz - 下载文件,无需ftp/sftp
下一篇: 我使用过的Linux命令之type - 显示命令的类型
codingstandards
博客等级 码龄16年 12粉丝 3原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值