Android Studio JNI学习之(3)-使用SWIG自动生成Jni代码

    在上一编博客中展示了将原生代码和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文件所在的目录添加到环境变量中。


通过示例程序使用SWIG

    Android平台是简历在Linux操作系统上的多用户平台,在Linux系统中,给每个用户分配一个用户ID,由于平台独立的编程语言,Java无法访问用户ID,所以要用POSIX OS API的getuid函数查询这个用户ID。

    1、接口文件

      在jni文件下新建Unix.i接口文件

Android Studio JNI学习之(3)-使用SWIG自动生成Jni代码_第1张图片

       文件内容如下:

/* 模块名是 Unix. */
%module Unix

%{
/* 包含POSIX操作系统API. */
#include
%}

/* 告诉 SWIG uid_t. */
typedef unsigned int uid_t;

/* 让SWIG 包装getuid函数. */
extern uid_t getuid(void);

2、用命令方式调用SWIG

      首先在建个用于保存java文件的包

Android Studio JNI学习之(3)-使用SWIG自动生成Jni代码_第2张图片


    打开Terminalcd到main目录,然后执行命令: swig -java -package com.study.eric.swig -outdir java/com/study/eric/swig jni/Unix.i



    执行命令后会发现生产了3个文件,一个C文件,两个Java文件


Android Studio JNI学习之(3)-使用SWIG自动生成Jni代码_第3张图片


    为了方便执行命令,新建External Tools

Android Studio JNI学习之(3)-使用SWIG自动生成Jni代码_第4张图片


    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

3、将SWIG集成到Android构建文件中

     新建swig-generate.mk


Android Studio JNI学习之(3)-使用SWIG自动生成Jni代码_第5张图片


   内容如下:

#
# @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变量

Android Studio JNI学习之(3)-使用SWIG自动生成Jni代码_第6张图片


SWIG_PACKAGE := com.study.eric.swig
SWIG_INTERFACES := Unix.i
SWIG_TYPE := c
include $(LOCAL_PATH)/swig-generate.mk

    然后执行ndk-build命令重新生产.so包


Android Studio JNI学习之(3)-使用SWIG自动生成Jni代码_第7张图片


    最后代码调用结果如下:

Android Studio JNI学习之(3)-使用SWIG自动生成Jni代码_第8张图片


总之,安装和使用swig都是非常简单的事情。使用swig能够大大减轻程序员的痛苦程度,帮助你更快的完成你想要的功能。

    


你可能感兴趣的:(Android)