Android NDK与SWIG
2016-07-06 01:00:00
# android
本文主要是《Android C++ 高级编程——使用 NDK》的笔记。
国内专门讲 NDK 的书籍寥寥无几,这本貌似是唯一一本翻译的,当然,国外还是有好几本关注 NDK 的书籍,但是都没有中文译本而已。
因为偷懒,实践的时候从网上拷贝的代码,结果某些作者太不靠谱,抄写的代码都是错的,坑死我了。
SWIG 基础
可以参考:
在 Android 中的使用
ubuntu 14.04 + eclipse
在 jni 文件夹中定义接口文件,SWIG 会基于此接口文件来生成相应的集成代码:
下面是接口文件 Unix.i:
1 | module Unix |
这个时候可以直接调用 swig 来生成集成代码,
1 | swig -java -package dev.xesam.ndk -outdir dev/xesam/ndk Unix.i |
注意:outdir 一定要事先就存在
不过为了方便,还是直接与 eclipse 整合比较好。在 jni 文件夹定义一个 swig.mk,将 swig 处理单独出来,swig.mk 内容如下:
1 | 定义包名,对应 -package 参数 |
注意,按照 Makefile 的规范来写,特别是空格与 TAB 的区别。
上面定义的 MY_SWIG_PACKAGE 等变量都定义在 Android.mk 中,将 swig.mk 加入到 Android.mk 即可。Android.mk 内容如下;
1 | LOCAL_PATH := $(call my-dir) |
定义完毕之后,工程大致结构如下:
project_dir
|--src
|--jni
|--Android.mk
|--Application.mk
|--swig.mk
|--Unix.i
在项目根目录运行
1 | ndk-build |
输入大致如下:
1 | mkdir -p ./src/dev/xesam/ndk |
运行完毕之后,工程大致结构如下:
project_dir
|--src
|--dev
|--xesam
|--ndk
|--Unix.java
|--UnixJNI.java
|--jni
|--Android.mk
|--Application.mk
|--swig.mk
|--Unix.i
|--Unix_wrap.c
|--libs
|--armeabi
|--libhello-ndk.so
libhello-ndk.so 可以在工程代码直接使用,当然,生成的 UnixJNI.java 需要补充 loadLibrary 调用:
1 | public class UnixJNI { |
测试Activity:
1 |
|