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 JNI——NDK与JNI基础

AndroidStudio NDK之使用OpenCV

Android NDK——实战演练之TextureView的应用之调用外接USB摄像头自动对焦并完成隐蔽拍照

我的Android进阶之旅NDK开发之CMake自定义搜索规则,减少每次都需要配置.cpp和.h的工作量

我的Android进阶之旅NDK开发之CMake自定义搜索规则,减少每次都需要配置.cpp和.h的工作量