NDK开发,没有你想象的那么难

NDK:Native Development Kit原生开发工具
html

NDK能干什么:NDK使得在android中,java能够调用C函数库。java

为何要用NDK:咱们都知道,java是半解释型语言,很容易被反汇编后拿到源代码文件,在开发一些重要协议时,咱们为了安全起见,使用C语言来编写这些重要的部分,来增大系统的安全性。还有,在一些接近硬件环境下,相信你们都清楚C与java的优劣。顺带提一下:NDK并不能显著提高应用效率。why?咱们都以为C语言比起java来讲效率要高出不少,一方面,随着jdk的不断更新,java的效率也随之提升;另外一方面,即使使用C语言编码提升了应用效率,可是在java与C相互调用时平白又增大了开销。linux

对于这些问题,这里就很少说了,但愿详细了解的,请各位自行搜索。android

NDK开发,第一步,固然是搭建环境shell

首先,去 http://developer.android.com/tools/sdk/ndk/index.html 下载你对应平台的开发工具数组

接着,咱们须要实现linux环境 下载cygwin  http://www.cygwin.com/  (对于64位的用户,能够直接下载我已经下载好的,百度的连接应该比在线安装快一些,正在上传到个人网盘,稍后将地址放在回复里面)安全

选择在线下载的朋友,建议选择下图的地址,(是国内的)函数

选择好下载源之后就是选择下载目录了。咱们用鼠标点开组件列表中的“Devel”分支,在该分支下,有不少组件,
工具

咱们必须的是:binutils,gcc,gcc-mingw,gdb开发工具

选好这四个目录了之后,就是漫长的等待了,能够去吃顿饭差很少了。

下面该配环境变量了:NDK环境变量须要将NDK根目录(其实就是ndk-builder.cmd文件的目录)加入系统环境变量

                                cygwin环境变量须要将bin目录加入系统环境变量

例如个人路径是:C:\java\android-ndk-r7b 和 C:\java\cygwin\bin 这两个

配置好环境后就能够开始编码了

一、新建一个android工程

二、在工程目录下添加名为 jni 的文件夹(必须)

三、在jni文件夹下新建你的.c文件(个人叫Hello.c)

四、在jni文件夹下新建名字为Android.mk文件

.mk文件中加入

LOCAL_PATH := $(call my-dir)    //当前路径(若是你了解shell语言,应该能够很轻松的理解)
include $(CLEAR_VARS)
LOCAL_MODULE    := Hello        //要生成的.so库名
LOCAL_SRC_FILES := Hello.c        //你的.c文件名字
include $(BUILD_SHARED_LIBRARY)

如今能够开始写咱们的C代码了,固然这里不能再去从main函数开始写,而是有固定的命名方式

如图,个人函数名为:Java_com_example_testndk_MainActivity_helloWorldFromC     (Java_包名_类名_函数名)

呵呵,写C的朋友可能要抱怨了,我何时写过这么长的函数名了。没办法,这是jni的规范,以Java_开头,后跟java应用的包名加上类名,都是如下划线分割,最后才是跟咱们的C函数名

至于参数形式以及返回值类型,咱们能够去jdk目录下翻阅jni.h文件(个人jni文件目录:C:\java\jdk1.7.0_25\include\jni),有不少函数模板(不一样于C++模板)

因为源码太多你们本身去查看吧,我就不贴图了

在jni.h文件的第104行这里能够看到咱们返回的jstring本质上就是一个结构体指针,从C代码里面能够看到就是一个指向字符串的指针,在java里也就是一个数组。

好了,C代码讲解完毕,回到咱们android工程。

从刚才的C代码函数名,你们应该就能够知道个人java类名了(这是必须的,由于要一一对应嘛)
须要注意的是图中红色方框中的静态代码块


学过java你们都知道,一个 类在初始化的时候最早执行的不是构造方法而是静态代码块,没错也就是这里之因此把System.loadLibrary()放到静态代码块的缘由。从名字咱们就能够猜到了,加载库(“Hello”)

还记得咱们在Android.mk中声明的那个Hello吗,就是那里的名字

紧接着,看到第12行代码,回忆java知识了,用native修饰的方法,表示java的本地方法,也就是咱们的C函数了。(其实这样的函数在android SDK)中并很多见,好比咱们经常使用到的多媒体类MediaPlayer,你们能够去看看源码,这里我就不发了,里面有不少native方法,由于要调用音频驱动嘛。


至此,NDK工程就结束了,来测试一下吧。首先编译咱们的C代码。打开cmd,切换到工程目录下(工程目录?右键工程名,properties,如上图)输入ndk-builder(当时的环境变量设置成功了吗?去看看安卓工程的libs文件夹里面是否是多出来了个libHello.so文件) 而后咱们再运行咱们的安卓工程吧。 最后,我再说一点本身的见解吧,首先就是C语言的基础,结构体指针必定要掌握的好,好好看看jni.h文件给出了哪些函数,其中还有支持C与java交互的函数,要想用好NDK,先用好JNI