JNI系列教程三 —— NDK入门

3.1 背景

谈到JNI的使用场景,最常用的就是android NDK的编写了。首先从http://developer.android.com/ndk/downloads/index.html#download 把最新版的NDK下载下来。下载完之后得到一个exe文件,这其实是一个自解压文件,运行后自动解压,解压完成后的文件夹有3GB,所以你的磁盘空间起码得留足5GB左右的剩余空间。 最终我们得到这么一个目录结构:

ndk目录结构
图3.1.1 ndk目录结构
接着需要将ndk所在目录添加到环境变量PATH中,这样在以后运行的时候,只需要输出ndk-buld就可以了。文件夹plantforms存放着编译各个版本的android所需的头文件和动态库,举个例子platforms/android-3/arch-arm文件夹下存放的是android 1.5版本的arm平台的头文件和库文件,从android 2.3开始,开始支持x86mips两个平台,所以在platforms/android-9目录下会有arch-arm arch-mips arch-x86三个文件夹。

本文源地址:http://blog.whyun.com/posts/jni-ndk/ 转载请注明出处。

3.2 Android.mk

mk后缀的文件是makefile文件,mk文件一般通过include语法被引入到其它makefile中。在NDK中Android.mk里存储的都是编译相关的配置信息,我们先举一个例子:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE := chapter3
LOCAL_CFLAGS := -DJNI_ANDROID
LOCAL_LDLIBS := -llog -lm
TARGET_ARCH := arm
TARGET_PLATFORM := android-7
LOCAL_SRC_FILES := chapter3.c 

$(info $(SYSROOT))
include $(BUILD_SHARED_LIBRARY)

文件第一行中my-dir是一个函数,通过调用它返回当前路径,CLEAR_VARS变量指向一个mk文件,它会清除所有除了LOCAL_PATH之外的LOCAL_开头的变量,下面是一些列的对于LOCAL_开头的变量的定义:

3.3 简单例子

这个例子就是NDKsamples目录中hello-jni项目,将这个项目随便拷贝到某一个目录,然后删除掉项目中的tests文件夹,这个是一个单元测试,我不知道怎么使用它,所以直接删除掉。然后打开eclipse,选择File->Project...->Android->Android Project From Existing Code,选择刚才拷贝后的路径,点击完成。 在命令行中进入项目的jni文件夹,然后运行ndk-build,你会发现程序生成了好几个so文件夹,放置于项目的libs文件夹中,这是由于在文件Application.mk(位于文件夹jni中)文件中这一句造成的:
APP_ABI := all
ABI这个参数(可以参见百度百科词条ABI)比之前讲到的ARCH要更加细化,可以理解为在同一体系结构下CPU的不同版本,支持的指令集有所差异,android中支持的ABI可以参见谷歌官方ABI解释。最终在模拟器上运行程序成功:

运行hello-jni项目成功
图3.3 运行hello-jni项目成功