许久没写博客了,小编最近在学校的安排下到了深圳简单地学习了解了Linux系统,回校之后就对Android的底层充满了无限的兴趣。回来后,我第一件事就是想试一下NDK的开发,首先我得迈出的第一步是通过JNI调用底层的C函数。本以为很简单的一件事,做起来却耗费了不少时间,走了不少的弯路。小编看了很多大牛的文章,照着他们的步骤来做,很多是弄不出来的,尝试了各种方法,最后我总结一个简单的开发流程,一方面给有兴趣的同胞学习,另一方面用以备忘,在之后的开发,作为工具资料来使用。
关于那些基本的概念和原理,我这里不再一一介绍了,我直接讲操作流程就好了。
1、首先要下载好NDK的包,并且配置好环境变量
2、新建一个工程
3、在File=》Project Structe目录下把NDK的地址放进去
4、在工程目录下的local.properties下把SDK和NDK地址配置好(这里的斜杠注意要转义),这里基本编译器会帮我们搞定。
ndk.dir=D\:\\android-ndk-r13b
sdk.dir=C\:\\。。。\\Android\\Sdk
5、在你要调用C函数的类下边声明你要从C代码调用的函数,如
public native String sayHello();
6、接着打开AndroidStudio下边的终端(Termianal),把工作目录切换到src/main/java下,运行以下代码 :
javah -d ../jni 你的包名(全类名).引用本地方法的类的名称
Note:代码的含义是根据你声明的本地方法在上一级目录下生成一个jni的目录,以及在目录下生成一个相应的.h文件
7、复制jni的主体结构,建立一个C文件
8、接着,在App->build.grradle=> defaultconfig (项的后面加上)
ndk {
moduleName"myNativeLib"
ldLibs "log", "z", "m"
abiFilters "armeabi", "armeabi-v7a", "x86"}
Note:这会生之后生成一个libmyNativeLib.so文件,以及相应三种硬件架构的文件夹及相对应的文件。
9、在此点Build=>Make project,如果生成过的,就就Rebuild project
10、完成编译、链接后可以在app=>build=>intermediate=>ndk=>debug=>lib下会有上边moduleName配置生成的.so动态链接库
11、最后,当然是加载动态链接库了,在public native函数声明的上方,用static加载动态链接库 如:(看自己生成的库来改!)
static {
System.loadLibrary("myNativeLib");
}
12、最后,就可以在java上使用该函数了。
好了,有关于整个流程就到此为止了,有点粗枝大叶,比较适合动手操练,具体里边的逻辑,概念,请自行翻阅相关的资料。