本案例主要介绍如何利用NDK工具在Android上进行C/C++相关开发,通过生成的JNI接口,编写C/C++函数,编译生成so库,并调用so库,在Android应用层上实现int型加法操作,字符串显示操作和往/sdcard中文件yao.txt写入数据操作。
1:案例分析
地项目开发时,我们需要用到自己的底层函数(.c或.cpp文件)和相关so库,Google提供的NDK开发工具可以帮助我们解决这个问题,按照相关开发流程,我们可以在Android开发项目中调用本地的so库,实现本地开发模块。
2:开发环境
Eclipse (Galileo版本)
b:Android sdk 2.2 (注:NDK开发要求sdk 1.5以上版本)
c:jdk1.6
d:Android-ndk-r17b(注:这是最新版本ndk,这个版本是不需要用到cygwin工具,推荐使用此版本)
(注:2、3和4都需要配置环境变量,这个特别提醒一下。配置好以后可以在cmd输入相关命令测试一下环境变量是否配置成功。)
3:新建Android工程
Activity (底层的操作要在Activity上显示)。
4:编写native方法
native方法,第一个用于int型加法操作,第二个用于字符串操作,第三个用于向/sdcard的yao.txt文件中写入数据。
publicclass NDKTest {
//加法native方法
publicnativeint jniAdd(int a,int b);
//文本显示native方法
publicnative String jniGetString();
//向/sdcard中写入文件native方法
publicnativevoid jniWrite();
//三种方法通过libNDKDev-jni.so库文件来实现
static
{
System.loadLibrary("NDKDev-jni");
}
5:生成.h文件
在cmd模式下,进入工程下的bin文件目录,执行javah命令,如下图所示
从上图可以看到,生成了org_yao_ndk_NDKTest.h文件,进入此文件看看生成了哪些JNI接口,如下图所示:
从上图可以看到,生成了3个相应的JNI接口,注意其命名方式,Java_org_yao_NDKTest_Method。
6:编写.c文件
按照要求,编写相应的.c文件(.cpp文件也是可以的)注.c文件不需要同.h文件名字一样,而且上面生成的.h文件到此已经没有什么价值了,可以直接删掉。不过.c文件里面需要#include <jni.h>头文件。
7:编写Android.mk配置文件
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := NDKDev-jni
LOCAL_SRC_FILES := NDKTest.c
include $(BUILD_SHARED_LIBRARY)
8:拷贝文件
Android项目所在目录下新建jni文件夹,将NDKTest.c和Android.mk文件拷贝到jni文件里面。
和NDKDevDemo
根据上面的layout,在NDKDevDemo中编写代码,具体编写操作说明如下:
a:点击“文本显示/show”Button,在TextView中显示底层返回的字符串;
b:点击“加法运算/+”Button,在EditText中显示int型加法操作的结果;
c:点击“往sdcard中写入数据/write”,将相关数据写入/sdcard的yao.txt文件。
10:配置NDK
ndk即 android-ndk-r7b,不需要使用cygwin编译器。具体步骤如下:
a:右击项目所在工程,选中“Properties”,进入属性界面
b: 选中Builder选项,点击new..新建,进入edit configuration界面
分别在Location和WorkingDirectory中设置ndk-build.cmd命令(即android-ndk-r7b所在路径)和工作路径(即项目所在路径)。
11:生成.so文件
按照上述设置完成后,就可以生成so库文件了,到此整个工程编写完成,其详细的目录结构如下:
12:运行结果
注:向/sdcard中写入数据时需要在AndroidManifest.xml文件中加入:<uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"/>。
到这里,一个详细关于NDK开发案例讲解完毕。