在上一编博客中展示了将原生代码和Java应用程序连接的方法。如前所述,实现JNI封装代码和处理数据类型之间的转换是繁琐且耗时的开发任务。下面介绍SWIG(Simplified Wrapper and Interface Generator)就是简化上述过程的开发工具。
SWIG不是Android或Java的专用工具。它是一个可以生产许多其他编程语言代码的、广泛使用的工具,这里只会介绍Android相关概念:
Mac系统开发者可参照我另一篇博客 http://blog.csdn.net/liangjiangli/article/details/72832154
Windows系统开发者也需要去官网下载安装包:http://www.swig.org/ ,解压后,将exe文件所在的目录添加到环境变量中。
Android平台是简历在Linux操作系统上的多用户平台,在Linux系统中,给每个用户分配一个用户ID,由于平台独立的编程语言,Java无法访问用户ID,所以要用POSIX OS API的getuid函数查询这个用户ID。
在jni文件下新建Unix.i接口文件
文件内容如下:
/* 模块名是 Unix. */
%module Unix
%{
/* 包含POSIX操作系统API. */
#include
%}
/* 告诉 SWIG uid_t. */
typedef unsigned int uid_t;
/* 让SWIG 包装getuid函数. */
extern uid_t getuid(void);
2、用命令方式调用SWIG
首先在建个用于保存java文件的包
打开Terminalcd到main目录,然后执行命令: swig -java -package com.study.eric.swig -outdir java/com/study/eric/swig jni/Unix.i
执行命令后会发现生产了3个文件,一个C文件,两个Java文件
为了方便执行命令,新建External Tools
Program: /Users/daredos/Swig/bin/swig
Parameters: -java -package com.study.eric.swig -outdir $ModuleFileDir$/src/main/java/com/study/eric/swig $ModuleFileDir$/src/main/jni/Unix.i
Working directory: /Users/daredos/Swig/bin
新建swig-generate.mk
内容如下:
#
# @author liangjiangli
#
# 检查变量 SWIG_PACKAGE是否已经定义
ifndef SWIG_PACKAGE
$(error SWIG_PACKAGE is not defined.)
endif
# 用斜线替换Java目录的圆点
SWIG_OUTDIR:=$(NDK_PROJECT_PATH)/src/$(subst .,/,$(SWIG_PACKAGE))
# SWIG的默认类型是C
ifndef SWIG_TYPE
SWIG_TYPE := C
endif
# 设置SWIG的模式
#ifeq ($(SWIG_TYPE), cxx)
# SWIG_TYPE_MODE := - c++
#else
# SWIG_TYPE_MODE :=
#endif
# 追加SWIG封装源文件
LOCAL_SRC_FILES += $(foreach SWIG_INTERFACE, $(SWIG_INTERFACES),\
$(basename $(SWIG_INTERFACE))_wrap.$(SWIG_TYPE))
# 添加.cxx作为C++扩展名
#LOCAL_CPP_EXTENSION += .cxx
# 生成SWIG封闭代码(indention should be tabs for this block)
$_wap.$(SWIG_TYPE) : %.i \
$(call host-mkdir, $(SWIG_OUTDIR)) \
swig -java \
$(SWIG_MODE) \
-package $(SWIG_PACKAGE) \
-outdir $(SWIG_OUTDIR) \
$<
在Android.mk file中定义SWIG变量
SWIG_PACKAGE := com.study.eric.swig
SWIG_INTERFACES := Unix.i
SWIG_TYPE := c
include $(LOCAL_PATH)/swig-generate.mk
然后执行ndk-build命令重新生产.so包
最后代码调用结果如下:
总之,安装和使用swig都是非常简单的事情。使用swig能够大大减轻程序员的痛苦程度,帮助你更快的完成你想要的功能。