【Android】NDK与SWIG

不过为了方便,还是直接与 eclipse 整合比较好。在 jni 文件夹定义一个 swig.mk,将 swig 处理单独出来,swig.mk 内容如下:

# 定义包名,对应 -package 参数ifndef MY_SWIG_PACKAGE$(error MY_SWIG_PACKAGE is not defined.)endif# 定义输出目录,对应 -outdir 参数# subst 表示替换,即用 "/" 替换 包名中的 "."MY_SWIG_OUTDIR :=$(NDK_PROJECT_PATH)/src/$(subst .,/,$(MY_SWIG_PACKAGE))# 定义生成文件类型,这里默认是 cifndef MY_SWIG_TYPEMY_SWIG_TYPE := cendif# 如果目标源文件是 c++,那么在执行 swig 命令的时候就需要加上 −c++ 参数ifeq ($(MY_SWIG_TYPE),cxx)MY_SWIG_MODE := −c++elseMY_SWIG_MODE :=endif# 将生成的 .c 文件加入编译文件中LOCAL_SRC_FILES += $(foreach MY_SWIG_INTERFACE,$(MY_SWIG_INTERFACES),$(basename $(MY_SWIG_INTERFACE))_wrap.$(MY_SWIG_TYPE))# 定义 target,每个待生成的 XXX_wrap.c 源文件都依赖与之对应的 XXX.i 接口文件 # 由于 outdir 一定要存在,所以先创建 outdir 目录结构# $< 表示第一个依赖文件,也就是对应的 XXX.i 接口文件 %_wrap.$(MY_SWIG_TYPE) : %.i$(call host-mkdir, $(MY_SWIG_OUTDIR))swig \-java \$(MY_SWIG_MODE) \-package $(MY_SWIG_PACKAGE) \-outdir $(MY_SWIG_OUTDIR) \$<

注意,按照 Makefile 的规范来写,特别是空格与 TAB 的区别。

上面定义的 MY_SWIG_PACKAGE 等变量都定义在 Android.mk 中,将 swig.mk 加入到 Android.mk 即可。Android.mk 内容如下;

LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS) # 清除除了 LOCAL_PATH 之外的 LOCAL_* 变量LOCAL_MODULE    := hello-ndk # 设定一个唯一的名称