1. SWIG是什么?

SWIG的官方网站是 http://www.swig.org/ 。

官方网站第一句话:SWIG is a software development tool that connects programs written in C and C++ with a variety of high-level programming languages. ... ... SWIG is typically used to parse C/C++ interfaces and generate the 'glue code' required for the above target languages to call into the C/C++ code. ... ... SWIG is free software and the code that SWIG generates is compatible with both commercial and non-commercial projects.

翻译一下: SWIG是一种软件开发工具,可将用C和C ++编写的程序与各种高级编程语言相连接。... ... SWIG通常用于解析C / C ++接口并生成上述目标语言调用C / C ++代码所需的“胶水代码”。 ... ... SWIG是免费软件,SWIG生成的代码与商业和非商业项目兼容。

其中, “上述目标语言”,包括:脚本语言,如Javascript、Perl、PHP、Python、TCL和Ruby。非脚本语言,如C#、D、GO语言、Java、Lua、OCaml、Octave、Scilab和R。

也就是说,SWIG是 可以为其他语言比如Python、java等,生成能够调用使用C和C++编写的库的相关代码的 一个免费软件。

2. SWIG能做什么?

我个人认为,SWIG就是要为其他编程语言生成 能够调用 C和C++编写的库 的中间代码。

举个例子,如果你知道Java 可以通过JNI 调用C和C++,那么SWIG也就是 “做JNI的事情”。

这里先解释一下 “做JNI的事情”:

当我们在进行Java开发时候,在某些情况下是要调用C开发的库。但Java代码是没办法直接调用C开发的库,需要做大致两个步骤的开发才可行:

第一步,你要写一个Java层的代码,加载so库,以及声明一个native方法:

//MyFunJNI.java文件,包名为: com.my.fun
public class MyFunJNI {static {System.loadLibrary("myfun");}public final static native int doFun();
}

第二步,你要编写一个C层代码,对应第一步MyFunJNI中的doFun方法,并调用到你想要使用的C开发的库中的函数 int c_fun():

/myjni.c
jint Java_com_my_fun_MyFunJNI_doFun(JNIEnv *env,jobject thiz){return c_fun();
}

然后将myjni.c编程库,比如libmyfun.so,将这个libmyfun.so和C编写的库,放在java程序运行时能加载到的位置。

这样java程序就能调用C开发的库中的方法了。

在大部分情况下,第二步的代码编写是一个从Java翻译成C的枯燥无味的工作,尤其是里面涉及一些类型的转换工作,写的不熟悉的话还得自己动手查或者从别处copy。

但如果是使用了SWIG,那就不需要我们自己动手写第一步和第二步中的相关代码了,因为SWIG可以帮我们生成。

因此,我觉得SWIG做的事情,就是将你从“沉重枯燥易出错”的工作中解脱出来。

3. SWIG怎么用?

要想使用SWIG,需要先下载SWIG,可以在 https://sourceforge.net/projects/swig/files/ 下载自己操作系统对应的包。(如果感兴趣的话,官方也提供了源码以及在不同操作系统上的编译方法,自己可以动手修改编译。)

我使用的是Windows,因此我下载的是最新版本的 https://sourceforge.net/projects/swig/files/swigwin/swigwin-4.0.2/

下载完成之后并解压,然后配置SWIG的环境变量。配置完成之后,打开cmd窗口,输入swig 试试,是否配置好了。

先简单的看一下,swig怎么使用,这里以Android开发为例,以下是在Android Studio中进行的,这里默认NDK等相关开发环境已经准备好了,也已经建好了一个正常的APP Module,目录结构如下所示:

libs下的libmyfun.so(这里libmyfun.so跟上面第2节中的libmyfun.so不是同一个,这里的是个纯粹功能的库)为已经用C写好的so库,并且知道要使用so库中的函数为:int doFun();

(a). 先编写一个以 ".i"结尾的文件myswig.i,放到跟这个Module的build.gradle同一级目录(其实myswig.i可以放在任何位置),这个文件用于生成JNI对应的Java代码和C代码,myswig.i的内容为:

%module MySwig
%inline %{
extern int doFun();
%}

(b). 然后使用命令:

swig -java -package com.my.fun -outdir ../java/com/my/fun  -o ./myfun_wrap.c myswig.i
//注意,这个命令中,是在配置好swig的环境变量之后,在myswig.i这个文件所在的目录下执行的
//可以通过swig -help 命令查看参数含义
//其中 -java 表示要产生java相关文件
//-package 生成java文件的包名
//-outdir 表示将产生的java文件输出到的目录
//-o 表示产生的C或C++文件路径

执行这个命令后,会生成几个文件:

myswig_wrap.c,MySwig.java,MySwigJNI.java

打开myswig_wrap.c文件之后发现里面发现有很多代码,其中最主要的代码为:

打开MySwigJNI.java 和 MySwig.java分别是:

   

这么看来,如果我们自己写JNI相关的代码,也基本是这样的代码。

(c). 最后在编写CMakeLists.txt文件,把生成myswig_wrap.c编译成libmyswig.so库,以及在MainActivity中使用MySwigJNI的doFun方法,运行一遍看看效果。

不过,不要忘了在java文件中加上 加载 System.loadLibrary("myswig"); 加载编译好的libmyswig.so库。

4. 最后

这里介绍的是SWIG最最基本的用法。

SWIG有一些团队学习成本,但它也能减少一些机械重复的编码工作。具体要不要在实际项目中使用SWIG,是仁者见仁智者见智的。

具体更多的用法可以参看官网:http://www.swig.org/

如果是做java或Android开发的,也可以看看:

http://www.swig.org/Doc1.3/Java.html

http://www.swig.org/Doc2.0/Android.html#Android_examples_intro

另外,https://www.jianshu.com/p/8d8fdb095f88 (Swig java Jni开发指南)写的也挺详细的。

使用SWIG,在java编程中调用动态库相关推荐

  1. Java调用动态库(转载)

    记得以前 Java 要调用C/C++写得动态库都是用的 JNI 方式,还需要自己写不少 C/C++ 代码.比如说要在Java中调用已有的动态库,如 Windows 的 user32.dll 的方法 M ...

  2. JAVA 代码交互率低的原因分析,深入剖析Java编程中的中文问题及建议最优解决方法...

    说明:本文为作者原创,作者联系地址为: josserchai@yahoo.com .由于 Java 编程中的中文 问题是一个老生常谈的问题,在阅读了许多关于 Java 中文问题解决方法之后,结合作者的 ...

  3. 正确的初始化,在 Java 编程中至关重要!

    有人说,你应该关注时事.财经,甚至流行的电影.电视剧,才有可能趁着热点写出爆文:有人说,你别再写"无聊"的技术文了,因为程序员的圈子真的很小,即便是像圈中鸿祥那样的招牌大牛,文章是 ...

  4. Java编程中的注意点

    Java编程中的注意点 Java基础部分 1.Java存放浮点数精度问题 Java中在HashMap存放浮点数会有精度问题,可以使用字符串来存放 2.while(k–)的相关问题 上面那个while的 ...

  5. 【Groovy】Groovy 脚本调用 ( Java 类中调用 Groovy 脚本 )

    文章目录 前言 一.Groovy 类中调用 Groovy 脚本 1.参考 Script#evaluate 方法分析 Groovy 类中调用 Groovy 脚本 2.创建 Binding 对象并设置 a ...

  6. java编程里的values怎么使用,详解Java编程中super关键字的用法

    这篇文章主要介绍了Java编程中this与super关键字的用法,包括从内存结构方面分析super的作用域,需要的朋友可以参考下 通过用static来定义方法或成员,为我们编程提供了某种便利,从某种程 ...

  7. 在VB 中调用动态连接库

    在VB 中调用动态连接库   2001-11-08· · ··yesky 1 2 3 4 5 6 7 8  下一页 作为一种简单易用的Windows开发环境,Visual Basic从一推出就受到了广 ...

  8. Java编程中“为了性能”需做的26件事

    下面是参考网络资源总结的一些在Java编程中尽可能要做到的一些地方. 1.尽量在合适的场合使用单例 使用单例可以减轻加载的负担,缩短加载的时间,提高加载的效率,但并不是所有地方都适用于单例,简单来说, ...

  9. 利用JNative实现Java调用动态库

    由于项目要求,需要用Java调用windows的dll文件,查了一下,如果用JNI的话是比较麻烦的,在sourceforge.net上搜索了一下 "Java dll",首先出现的是 ...

最新文章

  1. k8s源码架构目录分析
  2. 最高标号预留与推进算法 --- 就是要比 Dinic 快!
  3. [NOIP2014]联合权值
  4. 斯柯达柯珞克显示服务器错误,斯柯达柯珞克原来还有四驱的版本,不信你看!...
  5. 乌班图安装mysql 目录_Ubuntu 安装mysql 自定义数据存储目录
  6. html中实现类似于弹幕的效果代码,javascript实现弹幕效果
  7. zookeper安装_zookeeper安装单机模式
  8. 华为证实 P40 将没有 Google 服务;李世石退役;Python 3.8.1 发布 | 极客头条
  9. Linux 下获取 IP 和 MAC Adr 的方法
  10. wordpress用途_8个热门WordPress多用途主题及其炫酷功能
  11. “汇新杯”青年创客专项赛介绍
  12. 计算机开机桌面文件丢失怎么办,电脑重启桌面文件丢失怎么办
  13. webpack serve 配置问题TypeError: Class constructor ServeCommand cannot be invoked without ‘new‘
  14. 关于实现某宝或某妈永久登录
  15. 西门子PLc程序,博途V16 V17版1200与多台G120变频器通过过modbus RTU485 通讯控制,模拟量转
  16. Halcon算子说明
  17. Pyecharts基本图:饼图
  18. java物联网程序设计基础_Java程序设计 19物联网
  19. Field xxxMapper in xxxxxxx required a bean of type ‘xxxxMapper‘that could not be found.
  20. nmon在linux应用

热门文章

  1. 计算机学院五名学生开发手语app,参考答案2020知到APP妙手传译-实用手语
  2. Unity有限状态机详解
  3. freemarker类型转换
  4. react学习—PureComponent纯组件
  5. Android Tangram模型:连淘宝、天猫都在用的UI框架模型你一定要懂
  6. 钉钉编辑在线表格突然闪退,整个钉钉就关了
  7. 华东师范计算机学硕难度,华东师范大学考研难吗?一般要什么水平才可以进入?...
  8. Redis 升级到 6.x 版本,10个双11大促都不是问题了
  9. 【Redis】不卡壳的 Redis 学习之路:从十大数据类型开始入手
  10. SQL 去掉字符串前面或后面0