首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >利用SWIG实现JAVA调用C/C++代码

利用SWIG实现JAVA调用C/C++代码

作者头像
菩提树下的杨过
发布2026-03-08 07:57:18
发布2026-03-08 07:57:18
1170
举报

swig 是1个可以将C/C++包装成其它语言(比如:C#, java , python)接口的工具,直接下载即可使用。

下面演示如何用它来调用C代码

一、写一个C示例 example.c

代码语言:javascript
复制
/* File : example.c */

/* 一个全局变量 */
double Foo = 3.0;

/* 计算正整数的最大公约数 */
int gcd(int x, int y) {
  int g;
  g = y;
  while (x > 0) {
    g = x;
    x = y % x;
    y = g;
  }
  return g;
}

二、编写C的接口类 example.i

代码语言:javascript
复制
/* File : example.i */
%module example

/* %{ %} 内的代码会原样拷贝到生成的C包装文件中 */
%{
/* 包含C头文件或声明需要包装的函数 */
extern int gcd(int x, int y);
extern double Foo;
%}

/* 解析以下内容以生成Java接口 */
extern int gcd(int x, int y);
extern double Foo;

三、生成&编译

3.1 终端里输入:

代码语言:javascript
复制
swig -java example.i

执行成功后,你会看到目录下新生成了三个文件:

  • example_wrap.c:JNI包装代码。
  • example.java:Java层的模块类,提供了静态方法供我们调用。
  • exampleJNI.java:Java层的JNI接口类,定义了与C代码的底层映射。

3.2 生成.so(linux/unix平台)或.dll(windows平台)

以windows为例(使用MinGW):

代码语言:javascript
复制
gcc -shared example.c example_wrap.c \
    -I "C:/Program Files/Java/jdk1.8.0/include" \
    -I "C:/Program Files/Java/jdk1.8.0/include/win32" \
    -o example.dll

会生成example.dll文件

四、在java中调用

代码语言:javascript
复制
// File: main.java
public class main {
    static {
        // 加载我们刚刚编译生成的动态链接库
        // Linux/macOS下加载 "example" (对应libexample.so)
        // Windows下加载 "example" (对应example.dll)
        System.loadLibrary("example");
    }

    public static void main(String[] args) {
        // 调用C函数,就像调用Java静态方法一样
        int x = 42;
        int y = 105;
        int g = example.gcd(x, y);
        System.out.println("The greatest common divisor of " + x + " and " + y + " is " + g);

        // 访问并修改C全局变量
        // SWIG为全局变量自动生成了getter/setter
        System.out.println("Original Foo = " + example.getFoo());
        example.setFoo(3.14159);
        System.out.println("New Foo = " + example.getFoo());
    }
}

编译java源文件到class文件

代码语言:javascript
复制
javac *.java

至此,目录下的文件清单如下:

  • example.c
  • example.class
  • example.dll
  • example.i
  • example.java
  • exampleJNI.class
  • exampleJNI.java
  • example_wrap.c
  • main.class
  • main.java

运行测试(jdk25环境):

代码语言:javascript
复制
java.exe '-Djava.library.path=./' --enable-native-access=ALL-UNNAMED main
image
image
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2026-03-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档