编写JNI封装器的代码,还有处理数据类型的转换耗时且费力,所以要用到 SWIG。
SWIG 的全称是 Simplified Wrapper and Interface Generator,它是一个开发工具,在Android Native开发中可被用来自动生成需要的 JNI 封装器代码。
当然,SWIG 不只是能被用在 Android 和 Java 开发领域,它是一个扩展性方面很强大的工具,也可以用来自动生成其它编程语言的代码。
当期用于 Android Native 开发中时,需要了解如下一些知识:
SWIG是一个运用于编译环节的软件开发工具,它能生成出代码来使得用 C/C++ 编写的代码可以同其它编程语言连接在一起。
SWIG以接口文件作为输入,输出的是特定语言(如Java)的代码文件,输出的文件直接可以编译运行。
SWIG诞生于1995年,开始的时候用于科研,如今作为通用工具在以 GUI GPL 协议开放了源代码,官网是:www.swig.org。
SWIG在三大主力平台都可以安装,下载地址:www.swig.org/download.html,windows 中下载到的是一个zip压缩包,解压然后配置好环境变量(SWIG_HOME,Path)即可使用了。
Android 平台基于 Linux OS 构建,Linux 是一个多用户平台,Android 利用了这一点,在其上的每个APP都是在不同 Linux 用户下的虚拟机沙盒中运行的,这样具有安全性方面的好处。Java 不能直接获取到 Linux 的用户 ID,所需必须通过 Native 的方式调用原生 POSIX OS API 中的 getuid 才能获取到。流程如下:
接口文件包含了函数原型、类以及变量的声明。语法同普通的 C/C++ 头文件相同,不过除了可以在其中使用 C/C++ 关键词以及预处理指令以外,还包含了 SWIG 特有的指令,利用它们能生成封装的代码。
接口文件可以被放在Android工程的jni目录下,后缀名为.i,例如:Unix.i。
在命令行中运行 swig 命令就可以在相应文职生成原生代码和Java代理类,例如:
swig -java -package com.apress.swig -outdir src/com/apress/swig jni/Unix.i
我们可以在 Android 的Java类中调用生成的 Java 代理类中暴露的方法来实现对原生功能函数的调用。
这在回调场景中可以被用到,对于处理一些延时长操作比较有用。