Android Studio JNI学习之(3)-使用SWIG自动生成Jni代码
2017-06-02 14:02
239 查看
在上一编博客中展示了将原生代码和Java应用程序连接的方法。如前所述,实现JNI封装代码和处理数据类型之间的转换是繁琐且耗时的开发任务。下面介绍SWIG(Simplified Wrapper and Interface Generator)就是简化上述过程的开发工具。
SWIG不是Android或Java的专用工具。它是一个可以生产许多其他编程语言代码的、广泛使用的工具,这里只会介绍Android相关概念:
Windows系统开发者也需要去官网下载安装包:http://www.swig.org/ ,解压后,将exe文件所在的目录添加到环境变量中。
文件内容如下:
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
内容如下:
在Android.mk file中定义SWIG变量
然后执行ndk-build命令重新生产.so包
最后代码调用结果如下:
总之,安装和使用swig都是非常简单的事情。使用swig能够大大减轻程序员的痛苦程度,帮助你更快的完成你想要的功能。
SWIG不是Android或Java的专用工具。它是一个可以生产许多其他编程语言代码的、广泛使用的工具,这里只会介绍Android相关概念:
安装
Mac系统开发者可参照我另一篇博客 http://blog.csdn.net/liangjiangli/article/details/72832154Windows系统开发者也需要去官网下载安装包: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能够大大减轻程序员的痛苦程度,帮助你更快的完成你想要的功能。
相关文章推荐
- 使用SWIG自动生成JNI代码
- Android 使用SWIG生成Jni代码
- Android 使用SWIG生成Jni代码<转>
- Android 使用SWIG生成Jni代码
- 使用SWIG自动生成JNI代码
- Android 使用SWIG生成Jni代码
- 使用Swig自动生成JNI代码
- Android 学习使用annotationprocessor自动生成java文件
- OPhone/Android的学习(2)—从分析Eclipse自动生成的代码到以XML控制UI
- android开发使用greenDAO如何自动生成代码
- SpringBoot学习-如何使用mybatis-generator-maven-plugin自动生成代码
- android jni方式调用c++代码并在其它app中使用生成的.so文件
- 学习如何使用Mybatis-generator 自动生成java代码以及Mapper文件
- android 使用swig工具, 依据JNI文件快速生成对应java文件
- MyIbatis学习 (一)--使用Generator自动生成代码
- 使用CodeSmith根据数据库中的表自动生成WinUI界面(使用TableLayoutPanel布局)的代码.
- [导入]使用JET自动生成代码
- ibatis - 自动代码生成工具abator 使用介绍
- AutoCode (vs插件)自动生成代码插件 下载及使用教程(C#版)
- 如何高效地使用XCodeFactory自动生成的数据层代码(一)