Android底层基础之NDK(一)
2015-07-24 20:14
453 查看
在本章中主要介绍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栏目会出现信息提示:
这样我们就完成了工程配置。此时运行之后,真机或者虚拟机就会出现运行效果:
在这个案例中,主要涉及到了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语言实现的库文件。
具体的运行原理细节之后会在另一篇文章中讲述。
下载完成之后解压,我解压的位置是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 Api Demos登顶之路(二)
- android 手机获取外置SD卡路径
- android的测试方法,
- android 不同手机外置SD卡路径不同
- Android Studio如何在真机中调试
- Android Ion
- Android 获取view在屏幕中的位置
- android getViewTreeObserver的使用
- universal-image-loader 使用思路
- 设置dialog的大小
- android代码的形式让button变成圆角 透明,如图
- Android 真机测试应用
- android:layout_weight的含义
- android 按钮按下效果(文字颜色和按钮同时变化)
- Android程序退出彻底关闭进程的方法
- Android FAT分区格式化
- Android 音频播放之SoundPool的使用和封装
- 关于Android中物理按键不响应的可能的一个问题。
- android studio中如何添加删除工程(module)
- Android Screen Monitor 下载地址