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接口文件

       文件内容如下:

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

    


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
您好!关于在Android开发中使用SWIG生成JNI代码的问题,我可以给您一些指导。 SWIG(Simplified Wrapper and Interface Generator)是一个工具,可以用于将C/C++代码包装成其他编程语言(如Java)的接口。在Android开发中,您可以使用SWIG来生成JNIJava Native Interface)代码,以便在Java和C/C++之间进行交互。 下面是一些基本的步骤来使用SWIG生成JNI代码: 1. 安装SWIG:首先,您需要安装SWIG工具。您可以从SWIG的官方网站(http://www.swig.org)下载适合您操作系统的版本,并按照安装指南进行安装。 2. 编写SWIG接口文件:创建一个名为`example.i`的SWIG接口文件,并在其中定义您要包装的C/C++代码的接口。例如,如果您要包装一个名为`example.h`的头文件中的函数和结构体,您可以在接口文件使用类似以下的代码: ``` %module example %{ #include "example.h" %} %include "example.h" ``` 3. 生成JNI代码使用以下命令来生成JNI代码: ``` swig -java example.i ``` 该命令将生成一系列的JNI文件和一个Java文件,用于在Java中访问C/C++代码。 4. 将生成的文件添加到Android项目:将生成的JNI文件(通常是`.c`和`.h`文件)添加到您的Android项目的`jni`目录中。确保您的项目已正确配置NDK构建系统。 5. 在Java使用JNI代码:在Java类中,您可以使用生成的Java文件中的JNI包装器来访问C/C++代码。例如,您可以使用`System.loadLibrary("example")`来加载生成的JNI库,并使用JNI函数来调用C/C++函数。 这是一个简单的概述,描述了如何使用SWIG生成JNI代码。请注意,SWIG提供了许多高级功能和选项,可以根据需求进行配置和定制。 希望这些信息对您有帮助!如果您有任何其他问题,请随时提问。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值