C与java交互之SWIG说明10Word格式文档下载.docx
- 文档编号:4905273
- 上传时间:2023-05-04
- 格式:DOCX
- 页数:12
- 大小:289.74KB
C与java交互之SWIG说明10Word格式文档下载.docx
《C与java交互之SWIG说明10Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《C与java交互之SWIG说明10Word格式文档下载.docx(12页珍藏版)》请在冰点文库上搜索。
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(){
virtualvoidtest()=0;
};
C函数,用于获取IServiceTest类的一个实例
extern"
C"
{
IServiceTest*GetInstance();
}
#endif/*ISERVICETEST_H_*/
具体实现类代码
ServiceTestImpl.h
#ifndefISERVICETESTIMPL_H_
#defineISERVICETESTIMPL_H_
#include"
IServiceTest.h"
;
classServiceTestImpl;
classServiceTestImpl:
publicIServiceTest{
ServiceTestImpl(){
virtual~ServiceTestImpl(){
virtualvoidtest();
IServiceTest*GetInstance();
#endif/*ISERVICETESTIMPL_H_*/
ServiceTestImpl.cpp
*IServiceTest.cpp
ServiceTestImpl.h"
#include<
stdio.h>
voidServiceTestImpl:
:
test(){
printf("
%s\n"
"
TestService......"
);
IServiceTest.cpp
IServiceTest*GetInstance(){
returnnewServiceTestImpl();
然后编写接口文件:
IServiceTest.i
%moduleServiceTest
%{
%}
%include"
接下去就是使用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的接口文件:
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