swig c 调用java_使用swig将C/C++代码转为JAVA接口(Windows平台)

小弟一直没用过Linux。

平时的码也只是在WINDOW上用SWIG或CYGWIN进行编译。

下面的例子,先从网上找来一个.c文件。

example.c

/* File : example.c */

#include

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(

return ctime(

}

要生成JAVA接口,就需要编写.i文件。

文件 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();

当然如果也可以使用头文件的形式。如果有些声明放在头文件中(如有个头文件:javaApi.h),可以直接使用:

%module  api

%{

#include "javaApi.h"

%}

%include "javaApi.h"  //注意,这里不需要使用#号

上面的文件保存到事先命名好的文件夹下。这里为:f:\so\sojava

aa22a05c90fcc839df26ed58d1a27858.png

打开SWIG;我的SWIG安装在D:\Program Files\swigwin-2.0.4

在命令行下CMD->d:进入到D盘。输入cd D:\Program Files\swigwin-2.0.4 进入到SWIG所在目录。(以上这些操作在设置好环境变量后就不用这么麻烦了)

下面步骤是将.i文件生成JAVA接口

命令

swig -java example.i

如果是编译C++的.i文件 swig  -c++  -java example.i

如果JAVA中需要指出包名和输出路径可以使用一些参数如:

swig -c++  -java -package com.example -outdir ./  -l../include example.i

-package 来指定JAVA包名如:com.example

-outdir 来指定生成的文件存放路径 ./表示当前路径下。

-l 用来连接.i文件所在的路径。

编译后输出有.java文件和wrap文件。

8f6cb87c80e7979cb239498664693b79.png

将example_wrap.c文件打包成SO;

打开CYGWIN

进入到sojava目录

将example.c 和example_wrap.c编译成相应的.o文件。在这个过程需要jni.h和jni_md.h。因为我的JDK是1.6的。刚开始不知道需要这个,在编的时候老报错。

后来我搜索了下jni.h在我的CYGWIN中的目录:lib\gcc\i686-pc-cygwin\4.5.0\include下。于是我找到我JDK中的jni.h和jni_md.h将这里的替换了。于是就编过去了。

这里我还搞不懂怎么使用路径直接去我的JDK中的include里找jni.h。如果搞懂了就省去了替换这里的文件了。

替换后可以成功编译。

28311a4c3af9783fdf6f1359d81a7e2f.png

2e39953689acf67af0aa337de79b073e.png

使用命令:

gcc  -shared example.o example_wrap.o -o libOK.so

11241cc035b7ddc5a4ccb52a4f1aa877.png

这样最终生成so库.

d3dbfd9d0b39424a7c611c3853bd8c2f.png

话说到这里就应该可以使用JAVA来进行loadlibrary进行验证了。

但基于我没有LINUX环境,找朋友试了一下说加载失败,问题遗留先。我装虚拟机了,再来搞。

参考:

这两篇文章不错的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: SWIG是一个用于连接C/C++和其他编程语言的工具。它提供了一种简单的方式,可以通过自动生成中间代码来实现C/C++的功能与其他编程语言(如Java)之间的交互。 通过SWIG,我们可以将C代码换为Java代码,并在Java调用C库中的函数。这样做的好处是可以利用C/C++的高性能、底层控制和已有的库文件,并在Java使用这些功能。 要将C代码换为Java代码,我们需要这样做的步骤: 1. 创建一个SWIG接口文件,以描述C函数的输入和输出类型。这个接口文件使用SWIG定义的特定语法。 2. 使用SWIG运行器,将接口文件作为输入,并生成一个Java包含C函数的Java接口文件。 3. 创建Java代码,以断开连接的方式调用生成的Java接口文件中的C函数。 SWIG通过将C代码封装在JNI(Java Native Interface)调用中来实现C与Java的交互。这允许Java代码直接调用C代码,并从C代码中返回结果。 使用SWIG进行C到Java换可以使开发人员更加方便地利用两种语言的优点,提高开发效率和性能。SWIG还支持其他编程语言,如Python、Ruby和Perl,使C代码更容易与这些语言进行交互。 总之,SWIG是一个非常有用的工具,可以帮助在C/C++Java之间实现无缝的交互,为开发人员提供了更多的灵活性和选择,并最大程度地利用现有的代码和库文件。 ### 回答2: Swig是一个开源工具,用于将C/C++代码换为支持多种编程语言的代码,包括Java使用Swig可以很方便地将C代码换为Java代码换C代码Java需经过以下步骤: 1. 安装Swig:首先需要安装Swig工具,可以从Swig官方网站下载并按照指示进行安装。 2. 编写接口文件:接口文件是一个后缀名为.i的文件,用于定义需要换的C代码Java代码的映射关系。在接口文件中,需要指定需要换的C函数的签名以及导出到Java的类、方法、成员变量等。 3. 生成包装代码使用Swig生成器来生成C和Java代码的包装代码。通过运行类似以下命令来生成包装代码: ``` swig -java your_interface.i ``` 4. 编译和构建:在生成的C代码中,使用Java Native Interface(JNI)来与Java代码进行交互。使用C/C++编译器将C代码编译为共享库(.so或.dll文件),以供Java程序调用。 5. 构建Java代码:创建Java项目,在项目中引入包装代码并实现调用。可以使用JNI函数调用C函数,或直接使用包装代码生成的Java类和方法进行调用。 需要注意的是,换C代码Java并不是一种直接的换过程,可能存在一些依赖问题,对于一些复杂的C代码使用了C特定功能的代码,还需要在Java代码中添加适当的兼容性处理。 总结而言,Swig是一个强大的工具,可以将C代码换为Java代码,简化了C/C++Java之间的交互过程,提高了代码的可维护性和可扩展性。 ### 回答3: SWIG(Simplified Wrapper and Interface Generator)是一个用于将C/C++代码换为其他语言的工具。如果想要将C代码换为Java代码,可以使用SWIG来完成。 首先,在使用SWIG之前,需要确保已经安装好了SWIG,并且配置好了相关的环境变量。 接下来,需要创建一个包含C代码接口文件,该文件的后缀名通常为.i。在接口文件中,需要使用SWIG的语法来指定要换的C函数和类型。 然后,使用SWIG命令对接口文件进行处理,以生成Java代码。命令的语法通常为:swig -java interfacefile.i 完成上述操作后,会生成一系列的Java文件,包括接口文件中指定的函数和类型的Java封装类。 最后,可以将生成的Java代码导入到你的项目中,并与其它Java代码一起进行编译和运行。 需要注意的是,SWIG并非完美的工具,可能会有一些限制和问题。在使用SWIG进行CJava时,可能会遇到一些类型对应的困难,或者在C和Java之间的内存管理方面的差异。因此,在使用SWIG代码时,需要谨慎处理这些问题,并进行相应的修改和调试。 总之,通过使用SWIG,我们可以方便地将C代码换为Java代码,从而能够在Java平台使用C语言的功能和库。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值