移动周分享-第49期

Android-mvp 吴明

  • mvc与mvp对比
  • mvp

    • model:依然是业务逻辑和实体模型
    • view:对应于Activity,负责View的绘制以及与用户交互
    • presenter:负责完成View于Model间的交互
    • 关系图
      mvp关系图
  • View定义定义包括:Activity,xml,Fragment,adapter

  • Google定义MVP

Google-mvp

Google-MVP-demo

开源工具SWIG - 杨俊构

什么是SWIG

  • 官方网站 http://www.swig.org/
  • GitHub开源 https://github.com/swig/swig

  • SWIG是个帮助使用C或者C++编写的软件能与其它各种高级编程语言进行嵌入联接的开发工具。SWIG能应用于各种不同类型的语言包括常用脚本编译语言例如Perl, PHP, Python, Tcl, Ruby and PHP。支持语言列表中 也包括非脚本编译语言,例如C#, Common Lisp (CLISP, Allegro CL, CFFI, UFFI), Java, Modula-3, OCAML以及R,甚至是编译器或者汇编的计划应用(Guile, MzScheme, Chicken)。

  • SWIG普遍应用于创建高级语言解析或汇编程序环境,用户接口,作为一种用来测试C/C++或进行原型设计的工具。SWIG还能够导出 XML或Lisp s-expressions格式的解析树。SWIG可以被自由使用,发布,修改用于商业或非商业中。

快速开发

参考 http://www.swig.org/tutorial.html

  • eg: 将 C语言转化成java (Windows下)

    1. 下载Swig工具包

      SWIG在三大主力平台都可以安装,下载到的是一个zip压缩包,解压然后配置好环境变量(SWIG_HOME,Path)即可使用了。【真的一直在更新

    2. 新建example.c文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

/* File : example.c */

#include <time.h>
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(&ltime);
return ctime(&ltime);
}
  1. 编写接口文件example.i
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
        /* 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();
```
4. 建立Java模块
> SWIG也会产生JNI代码以便Jave代码进入C/CC++。以下是建立一个Jave模块的事例(cygwin):
$ swig -java example.i

$ gcc -c example.c example_wrap.c -I/c/jdk1.3.1/include -I/c/jdk1.3.1/include/win32

$ gcc -shared example.o  example_wrap.o -mno-cygwin -Wl,--add-stdcall-alias  -o example.dll

$ cat main.java
public class main {
public static void main(String argv[]) {
    System.loadLibrary("example");
    System.out.println(example.getMy_variable());
    System.out.println(example.fact(5));
    System.out.println(example.get_time());
}
}
$ javac main.java
$ java main
3.0
120
Mon Mar  4 18:20:31  2002
$
1
2
3
4
5
6
7
8
9
10
11
      
> (1)swig -java example.i 执行后会生成

> >符合JNI语法的C文件: example_wrap.c
> >生成Java类文件:exampleJNI.java,example.java

> (2)SWIG创建的wrapper文件可直接用来编译连接产生共享库,不需要再对生成文件进行编辑。
> (3)对Java程序员来说,SWIG是把C/C++代码嵌入到Java脚本的理想工具。SWIG理解C/C++申明,因此它可以解析C/C++头文件并产生Java模型并对其进行编码,编译之后,你就可以在Java中使用。

- SWIG 懒人方法
> 并非总是需要写一个专门的接口文件。如果你有一个头文件,你可以直接在其中包含SWIG接口,如例:

%module example
%{
/ Includes the header in the wrapper code /

include “header.h”

%}

/ Parse the header file to generate wrappers /
%include “header.h”

1
2

> 另外,有些人可能只包括SWIG条件指令在头文件中。例如:

ifdef SWIG

%module example
%{

include “header.h”

%}

endif

extern int fact(int n);

```

编写JNI封装器的代码,还有处理数据类型的转换耗时且费力,所以要用到 SWIG是java程序的福利。

总结

  • SWIG是一个运用于编译环节的软件开发工具,它能生成出代码来使得用 C/C++ 编写的代码可以同其它编程语言连接在一起。
  • SWIG 不只是能被用在 Android 和 Java 开发领域,它是一个扩展性方面很强大的工具,也可以用来自动生成其它编程语言的代码。
  • 总之,安装和使用swig都是非常简单的事情。使用swig能够大大减轻程序员的痛苦程度,帮助你更快的完成你想要的功能。

参考 NDK学习笔记(三)SWIG:自动生成JNI代码