本案例主要介绍如何利用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上显示)。

              

android 项目技术架构和开发文档模板 android开发项目实例_android

        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命令,如下图所示

      

android 项目技术架构和开发文档模板 android开发项目实例_android_02

从上图可以看到,生成了org_yao_ndk_NDKTest.h文件,进入此文件看看生成了哪些JNI接口,如下图所示:

     

android 项目技术架构和开发文档模板 android开发项目实例_button_03

从上图可以看到,生成了3个相应的JNI接口,注意其命名方式,Java_org_yao_NDKTest_Method。

          6:编写.c文件

        

android 项目技术架构和开发文档模板 android开发项目实例_button_04

 按照要求,编写相应的.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

    

android 项目技术架构和开发文档模板 android开发项目实例_button_05

            

根据上面的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”,进入属性界面

 

android 项目技术架构和开发文档模板 android开发项目实例_jni_06

b: 选中Builder选项,点击new..新建,进入edit configuration界面

android 项目技术架构和开发文档模板 android开发项目实例_button_07

分别在Location和WorkingDirectory中设置ndk-build.cmd命令(即android-ndk-r7b所在路径)和工作路径(即项目所在路径)。

    

android 项目技术架构和开发文档模板 android开发项目实例_eclipse_08

   

android 项目技术架构和开发文档模板 android开发项目实例_button_09

 11:生成.so文件

按照上述设置完成后,就可以生成so库文件了,到此整个工程编写完成,其详细的目录结构如下:

 

android 项目技术架构和开发文档模板 android开发项目实例_jni_10

        

  12:运行结果

  

android 项目技术架构和开发文档模板 android开发项目实例_properties_11

  

android 项目技术架构和开发文档模板 android开发项目实例_properties_12

注:向/sdcard中写入数据时需要在AndroidManifest.xml文件中加入:<uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"/>。

到这里,一个详细关于NDK开发案例讲解完毕。