通过swig,使用java调C++

默认情况下,编译器只会使用/lib和/usr/lib这两个目录下的库文件,通常通过源码包进行安装时,如果不指定--prefix,会将库安装在/usr/local/lib目录下;当运行程序需要链接动态库时,提示找不到相关的.so库,会报错。也就是说,/usr/local/lib目录不在系统默认的库搜索目录中,需要将目录加进去。

  配置验证码实现类so文件
1、首先打开/etc/ld.so.conf文件。
2、在include ld.so.conf.d/星号.conf下面一行,添加/usr/local/seal/release_dll,前面不需要加include。目的是为了导入验证码生成的动态库so文件。
3、保存后,在命令行终端执行:/sbin/ldconfig -v,使加入的配置生效,缓存到/etc/ld.so.cache文件中。之后,就可以使用验证码的so动态库文件。

**上面加完之后如果还有问题,需要在/etc/profile文件添加“export LD_LIBRARY_PATH=/usr/local/seal/release_dll”

   安装swig
1、解压swig-4.0.2.tar
2、进入解压后的目录,依次运行指令:

bash ./configure --prefix=/usr/local/swig-4.0.0 --without-pcre【即不需要安装pcre依赖】

make && make install
3、配置环境变量:
	(1)
		export PATH=$ANT_HOME/bin:$PATH(貌似没用) $ANT_HOME不存在
		export PATH=/usr/local/swig-4.0.0/bin:$PATH(关闭终端即消失,不是永久配置)
	(2)
	vim /etc/bashrc

	# 在最后一行加上
	export PATH=$PATH:/usr/local/swig-4.0.0/bin

	手动	source /etc/bashrc	生效

4、查看是否安装成功
swig -version

   编写swig使用的.i文件
1、引入C++头文件,module貌似和生成的java文件名有关系
 %module SwigVerifyCode
 %{
    #include "GenVerifyCode.h"
 %}
 %include "GenVerifyCode.h"
	swig生成文件
1、基于编写好的.i文件,使用swig命令生成java类和C++接口的wrap文件
swig -c++ -java -package com.code -outdir /usr/local/seal/release_dll/codejava -o /usr/local/seal/release_dll/code/swigVerifyCode_wrap.cpp /usr/local/seal/release_dll/code/swigVerifyCode.i

参数:
com.code:Java文件包名
/usr/local/seal/release_dll/codejava:生成的java文件保存目录
/usr/local/seal/release_dll/code/swigVerifyCode_wrap.cpp:指定.i文件生成的cpp文件位置和名称
/usr/local/seal/release_dll/code/swigVerifyCode.i:使用.i文件生成java代码

2、编译temp下所有java文件为class文件
javac /usr/local/seal/release_dll/codejava/(*).java

3、创建/com/code文件夹,移动生成的.class文件到/com/code文件夹下
mv /usr/local/seal/release_dll/codejava/(*).class /com/code

4、封装成jar包
jar -cvf /usr/local/seal/release_dll/verifycode-java.jar /com/code

5、封装.so包,生成.o文件
注意:因为swigVerifyCode_wrap.cxx中需要用到jni.h和jin_md.h,所以需要把其对应的路径包含进来。我的为安装jdk后的路径:
/usr/local/java/include
/usr/local/java/include/linux

在/usr/local/seal/release_dll下执行
gcc -c -fPIC /usr/local/seal/release_dll/code/swigVerifyCode_wrap.cpp -I/usr/local/java/include -I/usr/local/java/include/linux

-fPIC:表示编译为位置独立的代码,不用此选项的话编译后的代码是位置相关的所以动态载入时是通过代码拷贝的方式来满足不同进程的需要,而不能达到真正代码段共享的目的。
/usr/local/seal/release_dll/code/swigVerifyCode_wrap.cpp:通过.cpp文件生成.o文件

6、连接.o文件为so动态库
gcc -shared -o /usr/local/seal/release_dll/libverifycode.so /usr/local/seal/release_dll/swigVerifyCode_wrap.o

-shared该选项指定生成动态连接库(让连接器生成T类型的导出符号表,有时候也生成弱连接W类型的导出符号),不用该标志外部程序无法连接。相当于一个可执行文件
/usr/local/seal/release_dll/libverifycode.so:通过.o文件,生成的.so文件的路径以及名称,必须以是libxxx.so格式

7、在/usr/local/seal/release_dll目录下,将libGenVerifyCode.so和libverifycode.so、swigVerifyCode_wrap.o文件做关联
gcc -L. -lGenVerifyCode -shared -o /usr/local/seal/release_dll/libverifycode.so /usr/local/seal/release_dll/swigVerifyCode_wrap.o

-L.:表示要连接的库在当前目录中
-lGenVerifyCode:编译器查找动态连接库时有隐含的命名规则,即在给出的名字前面加上lib,后面加上.so来确定库的名称

将test.c与****同级目录****动态库libtest.so链接生成执行文件test:
$ gcc test.c -L. -ltest -o test

测试
编译java测试类,并关联jar包
javac -cp ./release_dll/verifycode-java.jar VerifyCodeTest.java
执行java’文件
java -classpath .:./release_dll/verifycode-java.jar VerifyCodeTest

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 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进行C转Java时,可能会遇到一些类型对应的困难,或者在C和Java之间的内存管理方面的差异。因此,在使用SWIG转换代码时,需要谨慎处理这些问题,并进行相应的修改和试。 总之,通过使用SWIG,我们可以方便地将C代码转换为Java代码,从而能够在Java平台上使用C语言的功能和库。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值