Swig工具在win10上使用

news2024/11/20 0:33:01

        SWIG 是一种软件开发工具,它将 C 和 C++ 编写的程序与各种高级编程语言连接起来。这里我们用它来将 C/C++ 转换成 Java。

一、Swig安装

1、下载

官网:SWIG官网下载

源码链接 GitHub:https://github.com/swig/swig.git

        这两个地址可能会出现无法打开,或者无法下载的情况,直接在网上搜索“Swig下载”,在第三方平台下载一个即可。

2、安装

        将下载的 swigwin-4.1.1.zip 压缩包解压,最好是解压到盘符根目录下,例如:D:\swigwin-4.1.1。可以看到有 swig.exe 在文件夹内。

3、设置系统变量

        将 swig.exe 所在路径添加至系统变量 Path 中。

4、验证

win+r 打开cmd,输入swig -version 查看版本信息:

swig -version

看到版本信息,就说明安装成功了。

        请忽略打印版本信息与上面版本信息不一致问题,以为官网下载异常,在网上随便找了一个版本下载。

二、Swig使用

        首先,个人需求是 Android 项目调用 so 库中方法。这里我们可以拿到 .h 文件,再通过 .h 文件编写 .i 文件,然后使用 Swig 工具通过 .i 文件生成 .java 文件。

1、so 库文件

        例如:so库中使用 c 写的 sotest.c 和 sotest.h。

/* File : sotest.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);
 }
/* File : sotest.h */
double My_variable = 3.0;

int fact(int n);
int my_mod(int x, int y);
char *get_time();

         正常情况下我们是看不到上面的 so 库中的代码,但是会给我我们提供上面的 .h 文件,这样我们就知道要调用的方法名称。

2、准备 .i 文件

        下面是我们要做的,根据上面的 sotest.h 文件自己写一个 sotest.i 文件。

/* example.i */
 %module example
 %{
 /*将头文件或函数声明放在这里,如下所示 */
 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 文件

        执行以下命令,Swig 会根据 sotest.i 接口定义脚本生成出若干个文件

swig -java sotest.i

        注意上面的 sotest.i 需要携带文件路径,例如我的文件放在 D 盘 SoTest 文件夹下,则命令为:swig -java D:\SoTest\sotest.i。执行完成文件夹下新增 example.java、exampleJNI.java 和 sotest_wrap.c 三个文件。

1)example.java

/* ----------------------------------------------------------------------------
 * This file was automatically generated by SWIG (http://www.swig.org).
 * Version 3.0.6
 *
 * Do not make changes to this file unless you know what you are doing--modify
 * the SWIG interface file instead.
 * ----------------------------------------------------------------------------- */


public class example {
  public static void setMy_variable(double value) {
    exampleJNI.My_variable_set(value);
  }

  public static double getMy_variable() {
    return exampleJNI.My_variable_get();
  }

  public static int fact(int n) {
    return exampleJNI.fact(n);
  }

  public static int my_mod(int x, int y) {
    return exampleJNI.my_mod(x, y);
  }

  public static String get_time() {
    return exampleJNI.get_time();
  }

}

2)exampleJNI.java

/* ----------------------------------------------------------------------------
 * This file was automatically generated by SWIG (http://www.swig.org).
 * Version 3.0.6
 *
 * Do not make changes to this file unless you know what you are doing--modify
 * the SWIG interface file instead.
 * ----------------------------------------------------------------------------- */


public class exampleJNI {
  public final static native void My_variable_set(double jarg1);
  public final static native double My_variable_get();
  public final static native int fact(int jarg1);
  public final static native int my_mod(int jarg1, int jarg2);
  public final static native String get_time();
}

        从 Java 的角度讲,接口的封装已经完成,但 native 方法调用相应的动态库还需要打包。

4、打包

        通过以下命令来打包。

gcc -c -fPIC sotest.c sotest_wrap.c -I F:\openjdk-19.0.2\jdk-19.0.2\include -I F:\openjdk-19.0.2\jdk-19.0.2\include\win32

        sotest.c 和 sotest_wrap.c 分别为原始的 c 文件和生成的 c 文件,后面的路径为自己安装 jdk 的路径,记得修改。jdk 请自行安装,环境变量配置参考 《JDK环境变量配置》。执行命令又发现 gcc "不是内部或外部命令,也不是可运行的程序",所以还需要配置 C 语言环境,安装 MinGw 并配置环境变量,参考《MinGw 配置》。由于公司网络的原因,导致最后安装失败:mingw-get: *** ERROR *** setup: unable to continue,后面的两步没有得到验证。

        全部完成后在执行上面命令,这时会生成 sotest.o 和 sotest_wrap.o 两个文件。接着执行下面命令:

gcc -shared -o sotest.so sotest.o sotest_wrap.o

        这时就生成了我们想要的 sotest.so 文件。

5、验证

        通过前面的方法调用生成的 so 库。

System.load("加载绝对路径文件");
System.loadLibrary("载系统库的默认路径")

参考:SWIG初体验

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/191443.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

STM32单片机智能蓝牙APP加油站火灾预警安防防控报警监控系统MQ2DHT11

实践制作DIY- GC0122-智能蓝牙APP加油站火灾预警 一、功能说明&#xff1a; 基于STM32单片机设计-智能蓝牙APP加油站火灾预警 功能介绍&#xff1a; 基于STM32F103C系列最小系统&#xff0c;MQ-2烟雾传感器&#xff0c;火焰传感器&#xff08;不能直视阳光会受到阳光干扰&…

Cesium 渐变长方体实现-Shader

position获取: 1.1 在cesium中,可通过vec4 p = czm_computePosition();获取 模型坐标中相对于眼睛的位置矩阵 1.2 vec4 eyePosition = czm_modelViewRelativeToEye * p; // position in eye coordinates 获取eyePosition 1.3 v_positionEC = czm_inverseModelView * eyePo…

Python流程控制详解

和其它编程语言一样&#xff0c;Python流程控制可分为 3 大结构&#xff1a;顺序结构、选择&#xff08;分支&#xff09;结构和循环结构。 Python对缩进的要求&#xff08;重点&#xff09; Python 是一门非常独特的编程语言&#xff0c;它通过缩进来识别代码块&#xff0c;…

ConditionalOnBean详解及ConditionalOn××总结

ConditionalOnBean详解 为什么学习ConditionalOnBean 在学习 Springboot 自动装配的时候遇到 Bean 装配和 Bean 配置需要条件判断的场景时&#xff0c;查阅了相关内容了解到 Conditional 和 ConditionalOnBean 注解&#xff0c;深入学习之后受益匪浅。 ConditionalOnBean测试…

后量子 KEM 方案:Newhope

参考文献&#xff1a; Lyubashevsky V, Peikert C, Regev O. On ideal lattices and learning with errors over rings[J]. Journal of the ACM (JACM), 2013, 60(6): 1-35.Lyubashevsky V, Peikert C, Regev O. A toolkit for ring-LWE cryptography[C]//Advances in Cryptol…

Linux常见指令大全(一)

&#x1f339;作者:云小逸 &#x1f4dd;个人主页:云小逸的主页 &#x1f4dd;Github:云小逸的Github &#x1f91f;motto:要敢于一个人默默的面对自己&#xff0c;强大自己才是核心。不要等到什么都没有了&#xff0c;才下定决心去做。种一颗树&#xff0c;最好的时间是十年前…

POE交换机全方位解读(上)

POE交换机在安防行业的应用&#xff0c;给视频监控系统带来了质的改变&#xff0c;POE交换机。可通过网线为无线AP、网路摄像头等PoE终端设备供电&#xff0c;传送距离可达100m&#xff0c;安装简单&#xff0c;即插即用。非常适合无线城市、安防监控等行业使用。 POE供电方案及…

「融云政企数智办公解决方案」入选「大信创产品目录」

1月31日&#xff0c;CIO 时代、新基建创新研究院联合公布“大信创产品目录”&#xff0c;“融云政企数智办公解决方案”成功通过审核&#xff0c;被正式纳入“大信创产品目录”。 据悉&#xff0c;CIO 时代、新基建创新研究院从去年底开始组织开展“大信创产品目录”征集工作&a…

【C语言 数据结构】数组与对称矩阵的压缩存储

文章目录数组的定义数组的顺序表示和实现顺序表中查找和修改数组元素矩阵的压缩存储特殊矩阵稀疏矩阵数组的定义 提到数组&#xff0c;大家首先会想到的是&#xff1a;很多编程语言中都提供有数组这种数据类型&#xff0c;比如 C/C、Java、Go、C# 等。但本节我要讲解的不是作为…

frp构建多级网络代理

简介frp 是一个专注于内网穿透的高性能的反向代理应用&#xff0c;支持 TCP、UDP、HTTP、HTTPS 等多种协议&#xff0c;采用 Golang 编写&#xff0c;支持跨平台&#xff0c;仅需下载对应平台的二进制文件即可执行&#xff0c;没有额外依赖。frp可以将内网服务以安全、便捷的方…

Idea 中【Maven】的环境配置

目录 一 maven 项目管理工具软件二.首先要安装Jdk1.7/8 和IDEA三.在IDEA中配置maven四.在MavenDemo01下 创建多个模块项目四.Jar包依赖 插件五.运用一 maven 项目管理工具软件 1 . Maven项目对象模型(POM),可以通过一小段描述信息来管理项目的构建,报告和文档的项目管理工具…

MQ如何保证消息不丢失

如何保证消息不丢失 哪些环节会造成消息丢失 其实主要就是跨网络的环境中需要考虑消息的丢失&#xff0c;主要是有以下几个方面 生产者往MQ发送消息MQ的Broker是集群有主从的&#xff0c;主节点把消息同步到从节点时也需要考虑消息丢失问题消息从内存持久化到硬盘时&#xf…

软考高级系统架构师背诵要点---软件架构设计

软件架构设计 软件架构的概念&#xff1a; 软件架构为软件系统提供了一个结构、行为和属性的高级抽象&#xff0c;由构成系统的元素的描述、这些元素的相互作用、指导元素集成的模式及这些模式的约束组成 软件架构41视图&#xff1a; 逻辑视图&#xff1a;主要是整个系统的抽…

Java基础:面向对象

一、设计对象并使用 二、封装 对象代表什么,就得封装对应的数据,并提供数据对应的行为。 1.private关键字&#xff1a;priviate修饰的成员变量只能在本类中访问。 2.this关键字&#xff1a;能够直接对应成员变量&#xff08;当局部变量名相同时&#xff09;。 3. 构造方法…

【Linux】十分钟快速了解Linux常用指令(建议收藏)

目录&#x1f496;一. 关机指令01. shutdown02. halt03. reboot&#x1f496;二. 常用指令04. ls05. pwd06. cd07. touch08. mkdir09. rm10. man11. cp(复制)12. mv指令13. nano14. cat15. less16. head17. tail18. find19. grep20. zip/unzip21. tar&#x1f496;三、 日期指令…

JS 中 reduce()方法及使用详解

reduce()方法可以搞定的东西特别多&#xff0c;就是循环遍历能做的&#xff0c;reduce都可以做&#xff0c;比如数组求和、数组求积、统计数组中元素出现的次数、数组去重等等。 reduce() 方法对数组中的每个元素执行一个由您提供的reduce函数(依次执行)&#xff0c;将其结果汇…

Python字符串分割方法【心得总结】

Python中字符串分割的常用方法 是直接调用字符串的str.split方法&#xff0c; 但是其只能指定一种分隔符&#xff0c; 如果想指定多个分隔符拆分字符串需要用到re.split方法 &#xff08;正则表达式的split方法&#xff09; 源码资料电子书:点击此处跳转文末名片获取 str.spli…

OAuth2简单介绍

目录 一、什么是OAuth2 二、OAuth2中的角色 1、资源所有者 2、资源服务器 3、客户 4、授权服务器 三、认证流程 四、生活中的OAuth2思维 五、令牌的特点 六、OAuth2授权方式 1、授权码 2、隐藏式 3、密码式 4、凭证式 一、什么是OAuth2 OAuth2.0是目前使用非常广…

7个高频出现的面试题

收集了2022年所有学生的面试题后&#xff0c;我整理出了7个高频出现的面试题&#xff0c;一起来看看。 高频问题1&#xff1a;请自我介绍下&#xff1f; 高频问题2&#xff1a;请介绍下最近做过的项目&#xff1f; 高频问题3&#xff1a;请介绍下你印象深刻的bug&#xff1f; 高…

Spring Batch 步骤对象-Chunk Tasklet

引言 接着上篇&#xff1a;Spring Batch 步骤对象-步骤Step与Tasklet 了解step步骤概念及其使用之后&#xff0c;本篇再来讲解spring batch使用更广&#xff0c;功能更强大的tasklet&#xff1a;居于块的批处理步骤&#xff1a;Chunk Tasklet 简介 居于chunk(块)的Tasklet相…