您的位置:首页 > 移动开发 > Android开发

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

2017-06-02 14:02 239 查看
    在上一编博客中展示了将原生代码和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接口文件



       文件内容如下:

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

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

/* 告诉 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

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

     新建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能够大大减轻程序员的痛苦程度,帮助你更快的完成你想要的功能。

    
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Android Studio java jni SWIG