关于Ndk的开发,网上已经有许许多多的文章可供学习参考,但是大多都是利用javah -jni xxx.xxx.xxxJni的方法去构造出一个jni粘合层的头文件。然后再去链接自己的本地方法。
的确学习这种方法更有助于了解ndk的本质。但是这里我使用CMake来快速开发NDK,这个也是最新版的Android Studio所提供的(ps:我使用的是Android studio 2.4 preview)
前方可能需要你科学上网
CMake,是一种可扩展的开源系统,可以在操作系统中以编译器独立的方式管理构建过程。与许多跨平台系统不同,CMake被设计为与本地构建环境一起使用。放置在每个源目录(称为CMakeLists.txt文件)中的简单配置文件用于生成标准构建文件(例如,Unix中的makefile和Windows MSVC中的项目/工作区),这些文件以常规方式使用。CMake可以生成一个本地构建环境,它将编译源代码,创建库,生成包装器并以任意组合构建可执行文件。
NDK,Android Native Development Kit(本地开发工具),我所理解的本地,就是一些已经静态加载好的,不需要在运行时使用JVM再去动态加载。如果理解有偏差请指正。
不说废话,立刻开锤。
安装CMake、LLDB和NDK。
打开SDK Manager
新建一个新的AS工程(这里请大家别着急)
切忌需要勾选include C++ Support 不然你就无法使用CMake进行快速构建环境,又要回到命令行去一个个的生成本地头文件。
接着就是无脑下一步就可以了。打开Project工程视图
可以看到CMake帮我们在main
目录下生成了一个cpp
目录,是不是与你使用以前方法创建的jni目录有点类似?对的,其实他们本质是一样的。为什么这样说,我们来查看一下Cmake最重要的一个配置文件,CMakeList.txt
。
红色区域就是告诉ndk-build
我这里需要添加一个本地lib。
接下来我们看看他是怎么将这个CMakeList.txt
包含进来的。
打开app的build.gradle
文件。
是不是想说一声:原来如此。
环境已经配好,就可以开始写我们的本地方法了。这里以fibonacci作为一个例子。
在cpp
下新建一个fibonacci.c
uint64_t fibonacci(unsigned int n){ if (n > 1) return fibonacci(n-2) + fibonacci(n -1); return n; }
再新建一个
my-jni-lib.cpp
文件// // Created by GeekHades on 17/5/11. // #include <jni.h> #include "fibonacci.c" extern "C" JNIEXPORT jlong JNICALL Java_org_hades_myndkprojecttest_MyJniUtils_fibonacci(JNIEnv *env, jobject instance, jint i) { // TODO return fibonacci(i); }
这里有几个参数可能很多文章都没有说明过,第一个参数JNIEnv * 这是一个JNI环境本身的一个指针,使用它可以与JVM进行交互。
第二个参数 当方法被声明为静态时
static
为jclass
类型,否则为jobject
类型。第三个参数就是这个方法本身需要的形参。
接下来是MyJniUtils.java
类
这里需要说的是三个地方,
第一,static
区域块中的System.loadLibrary(“native-lib”);
System.loadLibrary(“my-jni-lib”);是要引进
cpp
目录中的lib。至于他怎么找到的就是靠CMakeList.txt
第二,
native
的两个方法,其中fibonacci
是我自己创建的包含在my-jni-lib.cpp
这个文件中,stringFromJNI
是AS构建的时候创建的包含在native-lib.cpp
这个文件中,我之所以分开是想告诉大家可以随便创建你自己的本地方法。只需要按照CMAKE的语法来就行。
第三,也是AS中最人性化的一点,在行数右边的两个箭头,你只要点击它就会索引到这个方法所在的jni粘合层中(注意是粘合层和不是这个方法所在的.c文件),还有值得注意的一点是:* 当你没有创建本地方法的时候先创建了native
方法,AS会给你报错,你只要点击小灯泡他就会帮你自动创建一个本地索引。非常方便。*吹了大半天,最后演示一下效果:
先来看一下MainActivity.java
这里为了方便测试我就直接对文本设置了点击事件,点击后调用fibonacci(10);
最基本的NDK开发流程就是这样了,文章中有错误的地方欢迎指正。共同进步!