SWIG小例子

这个Android平台式建立在Linux OS平台上的,是一个多用户平台。
它运行的应用程序在一个虚拟机sandbox和把他们当做不同的用户
来让平台安全。在Linux上,每一个用户都分配一个用户ID,和用户ID
能够被PoSIX os API的getuid函数访问。作为一个独立的平台编程语言,
Java并不能提供获得这些函数。作为这个例子程序的一部分,
    1.写一个Swig接口文件来访问这个getuid函数
    2.整合swig到Android建立进程中。
    3.增加SWig产生的源文件到Android.mk建立文件
    4.使用者SWIG产生的代理类来询问这getuid
    5.展示结果到屏幕上
接口文件:
    swig接口文件包含函数原型,类和变量的定义。它的语法和普通
的c/c++头文件一样。除了c/c++关键字和预处理命令,这个接口文件
也能够包含SWIG指定的预处理指令(能够调节产生的封装代码);
    为了获得getuid,一个接口文件(unix.i)需要被定义。
    /* Module name is Unix. */
     %module Unix
     %{
          /* Include the POSIX operating system APIs. */
          #include < unistd.h>
     %}
  模块名:
  每一个调用的SWIG都需要指定一个模块名。这个模块名被用来命名
结果封装的文件。这个模块名被指定使用SWIG指定的预处理命令%module
和它应该出现在每个接口文件的开始处。
   用户定义的代码:
  SWIG仅仅使用这个接口文件当产生封装代码;它的内容没有超出这个
点。它是需要包含用户定义的代码在产生的文件中,例如任何需要编译
这个产生代码的头文件。当SWIG产生一个封装的代码时,它被分成5部分
。SWIG提供预处理命令来使开发者来指定代码片段应该包含在这些5部分

  % < section > %{
  . . .
  This code block will be included into generated code as is.
  . . .
  %}
这<section>部分能够取得值:
     begin:放在代码块在产生封装文件的开始出。它主要用来定义预处理
的宏。
     runtime:放代码块在SWIG的内部类型检测和其他支持函数处。
     header:放代码块到头文件部分和其他的帮助函数。可以省略
     wrapper:放在代码块紧靠在产生封装函数处。
     init:在加载时,放置代码块到初始模块的函数处。
类型定义:
  SWIG能够理解所有C/C++数据类型,但是把其他都当做对象和封装
他们作为指针。getuid函数的定义建议,它的返回值是uid_t,这并
不是一个标准的c/c++数据类型。SWIG将把它当做一个对象和将包装
为一个指针。这并不是优先的旋转,实际上uid_t是unsigned integer
,并不是一个对象。如下unix.i接口文件,使用typedef来告诉SWIG
getuid函数的真实类型。
  /* Tell SWIG about uid_t. */
  typedef unsigned int uid_t;
 函数原型:
  这个unix.i接口文件以getuid函数的原型结尾,如下
   uind_t getuid();
 产生Java的包对于代理类:
  New-package-com.appress.swig
 出发Swig:
  swig -java -package com.apress.swig 
-outdir src/com/apress/swig jni/Unix.ion the command line.
 产生文件jni下产生Unix_wrap.c和包下的UnixJNI.java和代理类
Unix.java在包com.apress.swig.
  整合SWIG到Android 建立进程
  建立Andoid建立片段为SWIG,new-file-my-swig-genrate.mk
  #
# SWIG extension for Android build system.
#
# @author Onur Cinar
#
# Check if the MY_SWIG_PACKAGE is defined
ifndef MY_SWIG_PACKAGE
$(error MY_SWIG_PACKAGE is not defined.)
endif
# Replace dots with slashes for the Java directory
MY_SWIG_OUTDIR := $(NDK_PROJECT_PATH)/src/$(subst .,/,$(MY_SWIG_PACKAGE))
. . .
# Default SWIG type is C
ifndef MY_SWIG_TYPE
MY_SWIG_TYPE := c
endif
# Set SWIG mode
ifeq ($(MY_SWIG_TYPE),cxx)
MY_SWIG_MODE := ? c++
else
MY_SWIG_MODE :=
endif
# Append SWIG wrapper source files
+ = $(foreach MY_SWIG_INTERFACE,\
$(MY_SWIG_INTERFACES),\
$(basename $(MY_SWIG_INTERFACE))_wrap.$(MY_SWIG_TYPE))
+ = .cxx
$(call host-mkdir,$(MY_SWIG_OUTDIR))
swig -java \
$(MY_SWIG_MODE) \
-package $(MY_SWIG_PACKAGE) \
-outdir $(MY_SWIG_OUTDIR) \
$<
整合SWIG到Android.mk
 为了使用这个建立系统片元,这个村子的Android.mk文件需要被修改。
这个建立系统编译需要三个新的变量被定义在Android.mk文件
   MY_SWIG_PACKAGE:定义这个SWIG产生代理类的Java包。在这个例子
中是com.apress.swig.package
   MY_SWIG_INTERFACES:应该被处理的SWIG接口文件的列表。在这个例子中
是Unix.i文件。
   MY_SWIG_MODE:命令SWIG产生的封装代码是C或者是C++,在这个例子中
是C代码。
   LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := hello-jni
LOCAL_SRC_FILES := hello-jni.c
MY_SWIG_PACKAGE := com.apress.swig
MY_SWIG_INTERFACES := Unix.i
MY_SWIG_TYPE := c
include $(LOCAL_PATH)/my-swig-generate.mk
include $(BUILD_SHARED_LIBRARY)
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值