Eclipse的ndk初步使用
1. 新建一个Android project 名为JNI
2. 编写jni文件
JNI(Java Native Interface)就是连接Java与Native的接口,主要是定义了一些JNI函数,让开发者可以通过调用这些函数实现Java代码调用C/C++的代码,C/C++的代码也可以调用Java的代码,这样就可以发挥各个语言的特点.Native程序就是非java的语言,主要是由c/c++语言编写的程序,JNI相当与两者之间的接口。
在工程目录下新建一个名为jni的文件夹,目录下生成两个文件test.c和Android.mk文件。
Android.mk是ndk-build的脚本文件,ndk-build使用的脚本文件是Android.mk和Application.mk,Application.mk是可选的。Android.mk文件是工程的编译脚本,告知编译系统关于源文件的一些信息,描述了编译原生程序所需的编译选项、头文件、源文件等等。Application.mk文件用来描述原生程序本身使用到的一些特性,如原生程序支持的ARM硬件指令集、STL支持等。
Android.mk的常用语句:
LOCAL_PATH := $(call my-dir)
Android.mk文件开头必须先定义好LOCAL_PATH变量。LOCAL_PATH定义了本地源码的路径,它用于在开发树中查找源文件。call my-dir指定了调用my-dir宏,这个宏函数是编译系统提供的,用于返回Android.mk文件本身所在的路径。
include $(CLEAR_VARS)
CLEAR_VARS由编译系统提供,指定让编译系统清除掉一些已经定义过的宏(如LOCAL_MODULE,LOCAL_SRC_FILES,LOCAL_STATIC_LIBRARIES等等),这些宏的定义都是全局的。当一个GNU MAKE在编译多个模块时,必须清除并重新设置它们。
LOCAL_ARM_MODE := arm
LOCAL_ARM_MODE指定生成的原生程序所使用的ARM指令模式,取值为arm或者thumb。arm表示使用32位的arm指令系统,thumb表示使用16位的arm指令系统。
LOCAL_MODULE :=test
LOCAL_MODULE指定模块的名称,即原生程序生成后的文件名。注意,如果生成共享库模块,编译系统会自动产生合适的前缀和后缀,对于本例中的源文件最终将生成名为libtest.so的共享库。
LOCAL_SRC_FILES := test.c
LOCAL_SRC_FILES指定将要编译打包进模块中的C\C++源代码文件列表,此处只有一个test.c文件。
include $(BUILD_SHARED_LIBRARY)
此语句用来指定生成的文件类型。BUILD_EXECUTABLE表示生成可执行程序, BUILD_SHARED_LIBRARY表示生成动态库, BUILD_STATIC_LIBRARY表示生成静态库。
Test.c的代码和Android.mk的代码如下:
3. 使用ndk-build进行编译
进入jni文件目录下:
输入ndk-build命令就可以在工程目录下生成libs文件夹,这里生成不同cpu架构的test可执行文件(Android.mk使用的是include $(BUILD_EXECUTABLE))。
根据模拟器的cpu将相同架构文件夹下生成的可执行程序test复制到模拟器或者手机中,在命令行窗口下输入命令即可让其运行
我这里用的是armeabi-v7a
使用eclipse的自动编译,虽然同样是使用ndk-build,但是更高效
1. 在JNI工程上右键选择Properties,点击Builders选项,再点击Builders选项页右侧的New按钮,然后双击Program项打开Edit Configuration对话框,在对话框的Name栏输入Builder的名称,这里输入“JNI_Builder”,在 Location 栏输入“${env_var:ANDROID_NDK}/ ndk-build.cmd” 设置要执行的命令,(这里的ANDROID_NDK是配置NDK环境时在系统变量中的名称,实验时需要结合自己的实际配置填写)可以自己具体设置,点击variables->edit variables->new .
2. 点击Working Directory右侧的Browse Workspace按钮选择JNI工程,最后点击Apply按钮应用更改.
3. 单击生成的JNI_Builder下的Refresh标签,勾选“Refresh resources upon completion”复选框。
单击Build Options标签,勾选“During auto builds”与“Specify working set of relevant resources”复选框,点击“Specify Resources”按钮,勾选JNI工程的jni目录,点击finish按钮,点击OK按钮关闭Edit Configuration对话框。
点击OK按钮关闭Properties对话框,这时JNI工程就会自动编译,最后在libs\armeabi目录下生成.c文件的可执行文件,效果如右图所示。以后在Eclipse中对jni目录下的任何文件进行修改保存操作,都会触发JNI_Builder重新编译工程。如果是使用ndk-build手动编译工程,那么每次修改完jni目录下的文件后都得在命令行窗口下对工程进行手动编译。