C与java交互之SWIG说明10Word格式文档下载.docx

上传人:b****1 文档编号:4905273 上传时间:2023-05-04 格式:DOCX 页数:12 大小:289.74KB
下载 相关 举报
C与java交互之SWIG说明10Word格式文档下载.docx_第1页
第1页 / 共12页
C与java交互之SWIG说明10Word格式文档下载.docx_第2页
第2页 / 共12页
C与java交互之SWIG说明10Word格式文档下载.docx_第3页
第3页 / 共12页
C与java交互之SWIG说明10Word格式文档下载.docx_第4页
第4页 / 共12页
C与java交互之SWIG说明10Word格式文档下载.docx_第5页
第5页 / 共12页
C与java交互之SWIG说明10Word格式文档下载.docx_第6页
第6页 / 共12页
C与java交互之SWIG说明10Word格式文档下载.docx_第7页
第7页 / 共12页
C与java交互之SWIG说明10Word格式文档下载.docx_第8页
第8页 / 共12页
C与java交互之SWIG说明10Word格式文档下载.docx_第9页
第9页 / 共12页
C与java交互之SWIG说明10Word格式文档下载.docx_第10页
第10页 / 共12页
C与java交互之SWIG说明10Word格式文档下载.docx_第11页
第11页 / 共12页
C与java交互之SWIG说明10Word格式文档下载.docx_第12页
第12页 / 共12页
亲,该文档总共12页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

C与java交互之SWIG说明10Word格式文档下载.docx

《C与java交互之SWIG说明10Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《C与java交互之SWIG说明10Word格式文档下载.docx(12页珍藏版)》请在冰点文库上搜索。

C与java交互之SWIG说明10Word格式文档下载.docx

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。

这样可以自动的编译生成了。

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 人文社科 > 法律资料

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2