Android底层基础之NDK
Posted 骨灵冷
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android底层基础之NDK相关的知识,希望对你有一定的参考价值。
在本章中主要介绍android平台下NDK的配置开发已经在文章末尾处附上自己对这个sample的理解。本章中使用的NDK 版本全名是android-ndk64-r10-windows-x86_64。
下载完成之后解压,我解压的位置是C:\\AndroidNDK\\下。
接下来打开Eclpise,在其中新建一个Android工程,命名为TestNDK。创建完成之后,在其根目录下新建一个jni文件。
接着打开AndroidNDK下的android-ndk-r10文件,在里面找到Android.mk和hello-jni.c两个文件,路径地址为:app\\android-ndk-r10\\samples\\hello-jni\\jni
将两个文件拷贝到工程的新建jni文件下,如下图:
完成之后,在工程的src目录下添加app\\android-ndk-r10\\samples\\hello-jni\\src\\com\\example\\hellojni内的HelloJni.java文件。在添加的过程中先用记事本方式打开它,找到它的包名为com.examples.hellojni,在src目录下创建同名的包之后把该java文件复制到包中。
最后在工程的Maniefest文件中修改Activity的名称为com.example.hellojni.HelloJni,图如下:
如上之后需要添加的c文件和java文件都完成了。
接下来需要配置我们的工程,使得我们的工程支持NDK编译。
首先在Eclipse中点击Project->Properties->Builders,点击New之后选择Program,最后点击OK
然后呢在弹出的配置对话框中进行如下设置:
在Main标签页中填写Location和Working Directory
Location填写的是ndk-build.cmd的目录,Working Directory填写的是我们的工程目录
修改Refresh标签如下:
修改Build标签如下:
接着在Bulid标签中点击Specify Resource按钮,在里面选择我们的工程,打上勾即可。
最后确定。
此时Console栏目会出现信息提示:
这样我们就完成了工程配置。此时运行之后,真机或者虚拟机就会出现运行效果:
分析:
这里只是说下小编自己的简单理解,深入的NDK运行原理之后再介绍。 在这个案例中,主要涉及到了2个文件,一个是Java的HelloJNI.java文件,还一个是hello-jni.c文件,至于Android.mk文件先不说了。在这两个文件中我们打开java文件看下:可以看到这个文件是一个Activiy,所以我们之前在Manifest中替换了启动Activity的类文件名称,由工程默认生成的MainActivity替换成了HelloJNI文件,在Manifest配置文件中记录了Acitivity信息,每个Acitivity可以由配置栏<activity>里的name属性来指向目标的java文件。 接下来看下在tv.setText方法的参数是一个函数名stringFromJNI,我们找到这个函数:
对于该函数是这样描述的:这是一个通过本地库“hello-jni”实现的本地方法,这个本地库必须被包裹在该应用程序中。其实这个本地库就是我们的C语言实现的库,里面存放了C/C++语言的方法。在虚拟机运行时,会调用这些库到虚拟机环境,并解析出里面的方法。NDK的一大作用就是方便了Java语言的编程和C/C++语言的编程互动,通过Java调用底层的C++库。C在底层的运行效率偏高。 我们再打开hello-jni发现里面只有一个方法,方法声明如下:
该方法的名称很长,但是仔细管擦可以发现其实这个方法由三个部分组成:Java+(包名)+(类名)+(方法名),这样就实现了本地方法的唯一对应声明。其实就是在哪个包的哪个类的哪个方法调用了本地方法。 那么java方法里如何调用到本地方法的呢,前面说过了加载库,所以在Java文件的最后看见如下:
这就是静态加载了c语言实现的库文件。 具体的运行原理细节之后会在另一篇文章中讲述。
以上是关于Android底层基础之NDK的主要内容,如果未能解决你的问题,请参考以下文章
Android NDK——源码编译脚本之Makefile 基础语法和Android.mk小结
Android NDK——实战演练之TextureView的应用之调用外接USB摄像头自动对焦并完成隐蔽拍照