C与java交互之SWIG说明10.docx
- 文档编号:2642609
- 上传时间:2023-05-04
- 格式:DOCX
- 页数:12
- 大小:289.74KB
C与java交互之SWIG说明10.docx
《C与java交互之SWIG说明10.docx》由会员分享,可在线阅读,更多相关《C与java交互之SWIG说明10.docx(12页珍藏版)》请在冰点文库上搜索。
C与java交互之SWIG说明10
C与java交互之SWIG说明
目录
1.SWIG介绍1
1.1.SWIG介绍1
2.C与java中交互2
2.1.Java中使用C库2
2.2.C中使用java库11
3.SWIG在C与android中11
3.1.在android工程中使用NDK11
1.SWIG介绍
1.1.SWIG介绍
这里主要介绍与C与java的交互,但是SWIG不仅仅局限于此,它提供了对多种语言之间相互交互的。
下面是官方给出的介绍:
SWIG是个帮助使用C或者C++编写的软件能与其它各种高级编程语言进行嵌入联接的开发工具。
SWIG能应用于各种不同类型的语言包括常用脚本编译语言例如Perl,PHP,Python,Tcl,RubyandPHP。
支持语言列表中也包括非脚本编译语言,例如C#,CommonLisp(CLISP,AllegroCL,CFFI,UFFI),Java,Modula-3,OCAML以及R,甚至是编译器或者汇编的计划应用(Guile,MzScheme,Chicken)。
SWIG普遍应用于创建高级语言解析或汇编程序环境,用户接口,作为一种用来测试C/C++或进行原型设计的工具。
SWIG还能够导出XML或Lisps-expressions格式的解析树。
SWIG支持的高级语音有C#,Go,Guile,Java,Lua,Perl,PHP,Python,Octave,R,Ruby,Tcl。
http:
//swig.org/index.php官方主页。
2.C与java中交互
说到交互,就是C中可以使用java,java中可以使用C。
2.1.Java中使用C库
在sems中关于详细解码部分,是java调用C的库实现的。
整个的开发过程是,需要设计一个接口部分,当然这个是C的代码,最后和现有的C的代码单独出来。
这个工程中如果是C++的话,那么使用虚函数,定义好接口。
类似于java中的接口分离原则。
然后根据这个接口定义SWIG的*.i文件,接口文件。
接口文件的语法是SWIG语法。
然后功能实现的具体功能就是C++实现了,如果实现就看业务了。
*.i的接口文件,可以使用SWIG编译成各个语言,比如在java中会生成一个JNI语法的文件。
然后连同这个JNI的包装文件一同编译成一个dll或者so文件。
这样C这边的工作做完了。
在编译*.i的文件的同时会生成一些java的文件。
这些java文件已经将接口封装好了,将这些java文件直接拷贝到工程中,然后再将dll或者so文件拷贝到工程中的lib下,在java文件中加载这些库文件。
所有的工作就完成了。
下面以一个简单的示例说明:
该示例为简单的java中调用C++中一个函数的功能。
环境是在windows下WinGW,在eclipse中实现。
新建一个C++工程:
SwigTest
新建一个接口文件:
/*
*IServiceTest.h
*
*Createdon:
2014年5月8日
*Author:
suhs
*/
#ifndefISERVICETEST_H_
#defineISERVICETEST_H_
//===========================================================================
classIServiceTest;
//---------------------------------------------------------------------------
/*
*说明:
服务
*/
classIServiceTest{
public:
IServiceTest(){
}
virtual~IServiceTest(){
}
public:
virtualvoidtest()=0;
};
//---------------------------------------------------------------------------
/*
*说明:
C函数,用于获取IServiceTest类的一个实例
*/
extern"C"{
IServiceTest*GetInstance();
}
#endif/*ISERVICETEST_H_*/
具体实现类代码
ServiceTestImpl.h
/*
*IServiceTest.h
*
*Createdon:
2014年5月8日
*Author:
suhs
*/
#ifndefISERVICETESTIMPL_H_
#defineISERVICETESTIMPL_H_
#include"IServiceTest.h";
//===========================================================================
classServiceTestImpl;
//---------------------------------------------------------------------------
/*
*说明:
服务
*/
classServiceTestImpl:
publicIServiceTest{
public:
ServiceTestImpl(){
}
virtual~ServiceTestImpl(){
}
public:
virtualvoidtest();
};
//---------------------------------------------------------------------------
/*
*说明:
C函数,用于获取IServiceTest类的一个实例
*/
extern"C"{
IServiceTest*GetInstance();
}
#endif/*ISERVICETESTIMPL_H_*/
ServiceTestImpl.cpp
/*
*IServiceTest.cpp
*
*Createdon:
2014年5月8日
*Author:
suhs
*/
#include"ServiceTestImpl.h"
#include
voidServiceTestImpl:
:
test(){
printf("%s\n","TestService......");
}
IServiceTest.cpp
/*
*IServiceTest.cpp
*
*Createdon:
2014年5月8日
*Author:
suhs
*/
#include"IServiceTest.h"
#include"ServiceTestImpl.h"
extern"C"{
IServiceTest*GetInstance(){
returnnewServiceTestImpl();
}
}
然后编写接口文件:
IServiceTest.i
%moduleServiceTest
%{
#include"IServiceTest.h"
%}
%include"IServiceTest.h"
接下去就是使用SWIG编译这个文件,生成java和JNI文件。
swig-c++-java-packagecom.tigerbro.swigtest-outdir.-oIServiceTest_wrap.cppIServiceTest.i
如果是存C程序,不加-c++的选项。
在生成了一些java文件,这时编写makefile文件,
Makefile
CXXFLAGS=-ID:
/jdk1.6.0_25/include-ID:
/jdk1.6.0_25/include/win32
#OBJS=IServiceTest.oServiceTestImpl.oSwigTest.o
OBJS=IServiceTest.oServiceTestImpl.oIServiceTest_wrap.o
LIBS=
TARGET=ServiceTest.dll
$(TARGET):
$(OBJS)
$(CXX)-shared-WI-Wl,--add-stdcall-alias-o$(TARGET)$(OBJS)$(LIBS)
all:
$(TARGET)
clean:
rm-f$(OBJS)$(TARGET)
然后编译,就生成了一个dll文件。
新建一个java工程,进行测试。
其中com.tigerbro.swigtest包下的三个文件是从c工程中拷贝的,如果在编译*.i时直接将输出目录直到java工程也可以。
编写SwigCallTest.java
packagecom.tigerbro.main;
importcom.tigerbro.swigtest.ServiceTest;
publicclassSwigCallTest{
static{
System.loadLibrary("ServiceTest");
}
publicstaticvoidmain(String[]args){
ServiceTest.GetInstance().test();
}
}
执行输出:
TestService......
2.2.C中使用java库
这里和java中使用C类似,可以在网上找找适当的例子,一般我们不会这样用。
3.SWIG在C与android中
3.1.在android工程中使用NDK
在android工程中,有些功能可能需要使用C++进行编写,比如一些licence管理的功能。
这样安全性较高。
如果直接使用JNI比较麻烦,所以使用SWIG,对JNI一层进行封装。
具体的做法和在java工程中使用C一样。
这里主要是环境中需要使用android的环境。
前提是需要知道NDK的环境。
需要下载NDK,然后新建一个android工程,在工程中新建一个jni的目录。
在jni目录下,新建一些C文件,和一个Android.mk文件,如果使用ecilpse的自动编译的话,需要进行一些配置。
在工程属性
新建一个Program,在Locations中查找到ndk-build.cmd,在workingDerectory中选择该工程。
在buildOptions中按照下图进行选填。
这样可以完成了编译的配置,在这里编写C的代码就可以自动在lib下生成*.so的库文件了。
但是这样的话,需要我们自己编写jni的文件。
许多的jni的语法,数据类型但是java程序员不太明白的,也是一些C程序员不熟悉的。
这个时候,可以使用SWIG进行封装,自动的生成JNI的代码。
只需要熟悉一下简单的SWIG的接口文件的编写规则。
具体实现看一个示例:
一个普通的C文件:
/*File:
example.c*/
/*Aglobalvariable*/
doubleFoo=3.0;
/*Computethegreatestcommondivisorofpositiveintegers*/
intgcd(intx,inty){
intg;
g=y;
while(x>0){
g=x;
x=y%x;
y=g;
}
returng;
}
提供了一个变量和一个函数。
一个SWIG的接口文件:
/*File:
example.i*/
%moduleexample
%inline%{
externintgcd(intx,inty);
externdoubleFoo;
%}
接下来就是使用SWIG进行编译这个example.i文件了。
$swig-java-packageorg.swig.simple-outdirsrc/org/swig/simple-ojni/example_wrap.cjni/example.i
也可以像上面配置NDK那样配置一个自定义builder。
这样可以自动的编译生成了。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- java 交互 SWIG 说明 10